草庐IT

shared_id

全部标签

c++ - 在类 : scoped_ptr or shared_ptr? 中将智能指针作为参数传递

我有一个类在一个公共(public)方法中创建一个对象。该对象是私有(private)的,对类的用户不可见。此方法然后调用同一类中的其他私有(private)方法并将创建的对象作为参数传递:classFoo{...};classA{private:typedefscoped_ptrFooPtr;voidprivateMethod1(FooPtrfooObj);public:voidshowSomethingOnTheScreen(){FooPtrfooObj(newFoo);privateMethod1(fooObj);};};我相信在这种情况下正确的智能指针将是一个scoped_pt

c++ - boost shared_ptr 和 'this'

我有两个具有父子关系的类(客户&订单目录&文件等)我有typedefboost::shared_ptrParentPtr在父类中创建子类的方法我需要子实例有指向它们父实例的指针。classChild{....ParentPtrm_parent;....}我希望它是一个shared_ptr,这样在存在子项时父项不会消失。我还有其他人持有ParentPtrs给父级(Parents的工厂方法返回一个ParentPtr)问题:如何给child一个ParentPtr尝试(1)。在Parent::ChildFactorychild->m_parent.reset(this);这会导致非常糟糕的事情

c++ - 将 make_shared 与 protected 构造函数 + 抽象接口(interface)一起使用

给定一个抽象接口(interface)和一个从该接口(interface)派生的实现,其中构造函数受到保护(只能从类工厂创建这些对象-以实现DI模式),我如何在工厂函数中使用make_shared?例如:classIInterface{public:virtualvoidMethod()=0;};classInterfaceImpl:publicIInterface{public:virtualvoidMethod(){}protected:InterfaceImpl(){}};std::shared_ptrCreate(){std::shared_ptrobject=std::mak

c++ - 使用重载放置新/删除提升 shared_ptr

我像这样将boostshared_ptr与我自己的内存管理器一起使用(精简示例,我希望其中没有错误):classMemoryManager{public:/**Allocatesomememory.*/inlinevoid*allocate(size_tnbytes){returnmalloc(nbytes);}/**Removememoryagian.*/inlinevoiddeallocate(void*p){free(p);}};MemoryManagerglobalMM;//Newoperatorsinlinevoid*operatornew(size_tnbytes,ogl2

c++ - 返回 vector<Foo> 或 shared_ptr<vector<Foo>>?

在一个函数中,哪个“return”更合适?一个。vector?B.shared_ptr>?换句话说,哪个文案不那么重,你会怎么做,为什么? 最佳答案 我想返回shared_ptr>很少有用。如果有几个对象可以保存它们可以操纵的共享vector,我只会这样做。对我来说,这表明存在设计缺陷。更好的选择可能是通过const引用返回。这避免了(可能很昂贵的)复制操作,但不允许访问者更改vector。如果您要返回本地std::vector您也可以通过参数返回它。如果真要回shared_ptr>,考虑是否shared_ptr>会完成这项工作(载

c++ - 将 ID 号映射到类

我正在建立一个系统,在该系统中,我可以根据从文件中读入的一些信息即时实例化类。所以,这必须在运行时完成。所讨论的类是多态的,并且都继承自CBaseTheoryEnt类。我想要做的是将ID号与每个类相关联(例如,使用无序映射)。本质上,我的管理类将查看从输入文件中读入的一系列ID号,然后实例化适当的类。将类与ID相关联然后根据输入实例化它们的理想且有效的方法是什么? 最佳答案 一种方法是使用模板函数来实例化CBaseTheoryEnt的子类:templateCBaseTheoryEnt*instantiator(){returnnew

c++ - 特定于线程的数据——为什么我不能只使用带有线程 ID 的静态映射?

在阅读POSIX线程时,我遇到了一个线程特定数据的示例。我确实有一个困惑的地方......线程特定的数据接口(interface)看起来有点笨拙,尤其是当你混合使用pthread_once、各种初始化程序等时。有什么理由我不能只使用静态std::map,其中键是pthread_self()id,数据值保存在std::pair的第二部分?我想不出只要它被包裹在互斥量中就无法工作的原因,但我没有看到任何关于它的建议或任何类似的东西让我感到困惑,因为它听起来比提供的API容易得多。我知道线程可能有很多catch-22,所以我想我会问一下,看看我是否要介入……一些不愉快的事情?:)

c++ - gcc4 模板错误或更可能是 id10t 错误

以下代码在VisualStudio下编译得很好,但gcc4.6.2或4.7都不能处理它。它似乎是有效的,但gcc似乎无法解决const和非const参数之间的区别。这可能是编译器错误吗?structCReadType{};structCWriteType{};templatestructAddPkgrConstByType{};templatestructAddPkgrConstByType{typedefTtype;};templatestructAddPkgrConstByType{typedefTtype;};templatestructAddPkgrConstByType{ty

c++ - 如果我将 std::shared_ptr 重置为自身会发生什么

以下程序因错误的glibcdoublefree错误而崩溃:#include#includeclassfoo{public:foo(){std::cout();std::cout由此我得到以下输出(后跟glibc错误):fooconstructedBeforeresetfoodestructedAfterresetfoodestructed很明显,在这种情况下,对象被销毁了两次。一次通过重置,一次通过std::shared_ptr超出范围。这实际上是我所期望的。关于cppreference但是我找到了以下文本(位于http://en.cppreference.com/w/cpp/memo

c++ - 将 shared_ptr 传递给 OpenGL?

如果我的代码通常会像这样运行:char*log=newchar[logLength];glGetProgramInfoLog(...,...,log)//PrintLogdelete[]log;如何使用C++11智能指针实现相同的结果?谁知道在我有机会删除那段内存之前会发生什么。所以我想我需要向下转换为C风格的指针? 最佳答案 如果您的代码在您的代码片段中确实看起来像那样,shared_ptr对这种情况有点矫枉过正,因为看起来您不需要分配内存的共享所有权。unique_ptr对数组有部分专门化,非常适合此类用例。当托管指针超出范围时