草庐IT

Unique_ptr

全部标签

c++ - vector<shared_ptr<Foo>> 到 vector<shared_ptr<const Foo>> 的隐式转换

根据thispage您可以隐式转换shared_ptr至shared_ptr.这很有道理。但是,当我尝试转换std::vector时遇到错误包含shared_ptr到一个包含shared_ptr的.有没有什么好的方法可以实现这种转化? 最佳答案 编号:std::vector>和std::vector>是不同的类型,因此您不能将一种类型的对象视为另一种类型的对象。如果你真的需要std::vector>,你可以很容易地用shared_ptr创建一个s到与原始元素相同的元素:std::vector>v;std::vector>cv(v.b

c++ - 在 std::auto_ptr 的构造函数中使用 `explicit` 关键字有什么原因吗?

这是用于在VS2008编译器中从标准指针构造std::auto_ptr对象的构造函数。templateclassauto_ptr{public:explicitauto_ptr(_Ty*_Ptr=0)_THROW0():_Myptr(_Ptr){}private:_Ty*_Myptr;};explicit是否有任何特殊原因?上面使用关键字?换句话说,为什么我不能初始化auto_ptr与std::auto_ptrptr=newClassA;? 最佳答案 因为否则您可能会无意中执行以下操作:voidfoo(std::auto_ptrp)

c++ - 在 shared_ptr 中使用 deallocator & allocator

我正在使用一些库函数,这些函数返回使用malloc或new创建的指针。因此,我根据使用的分配类型有自己的客户解除分配器。例如shared_ptrptr1(LibFunctA(),&MallocDeleter);//LibFunctAreturnspointercreatedusingmallocshared_ptrptr2(LibFunctB(),&newDeleter);//LibFunctBreturnspointercreatedusingnew现在,我知道这是对上述deallocator的一种非常幼稚的使用,但它还大量用于哪些其他场景?此外,如何使用客户分配器?我尝试如下分配自

c++ - 在多线程环境中使用 auto_ptr 交换对象而不锁定是安全的吗?

我在堆上分配了一些数据结构,它们很少被修改但需要快速读取访问。一个例子是在堆上分配的结构,许多线程以只读方式非常频繁地访问它。需要定期重写此结构并避免锁定争用我想知道使用auto_ptr是否安全基本上允许已获取引用的线程继续处理直到它们完成writer创建结构的拷贝,重写它并快速与结构的新auto_ptr实例交换指针。我从Java中的CopyOnWriteArrayList得到这个想法,并希望在C++中执行类似的性能。 最佳答案 std::auto_ptr在调用非常量成员(例如reset())时没有任何线程安全保证正如你所建议的。此

c++ - 处理容器中的 unique_ptr

我有一个指向模型、网格等的unique_ptrvector,如下所示:std::vector>mLoadedModels;我选择unique_ptr是因为它会在vector析构函数时自动释放数据,还因为稍后如果我需要重新加载所有模型(由于OpenGL上下文拆除/创建)我可以在我的资源管理器内部重置()并使其指向一个新的模型实例,它不会影响系统的其余部分。但我的问题是,您将如何与其他系统共享vector的内容?您不能只传递unique_ptr,因为那会改变所有权(由于它的unique_ptr),我希望在资源管理器中拥有唯一所有权。我想出的解决方案如下,将访问包装在以下结构中:templa

c++ - 无法从 std::shared_ptr <_Ty> 转换参数 1 (??)

在完成我的游戏原型(prototype)时,我遇到了这个错误,我以前从未见过。我试图将两个.cpp文件链接在一起,这个:#include#include"mage.h"#include"Warrior.h"#include"Rogue.h"#include"CharacterType.h"#include#include#include"Inventory.h"#include"blankEnemy.h"#include"Enemy.h"#include"Boss.h"#include#include#include"DeathMenu.h"#include"GameStart.h"#

c++ - 我可以在 C++ 中将类作为对象处理吗

这是我想要实现的目标:我有一个从主类继承的类(Class1到Classn)列表我希望能够实例化任何n个类的对象,而不必做一个大的switchcase(或等效的)。类似的东西:staticClassPointerTypeconst*constArrayOfClassTypes[]={Class1,Class2,..Classn};staticClass*GetObjectOfClass(inti){returnnewArrayOfClassTypes[i](someparametersfortheconstructor);}您可以在其他OO语言(如Delphi)中执行此操作,其中您具有T

c++ - 如何对数组使用 unique_ptr

我有课classA{public:A(){couta(newA[5]);//-doesn'tworkunique_ptra(newA[1]);//-doesn'tworkunique_ptra(newA);//-works}为什么会这样?我猜是关于移动构造函数的(由于析构函数,它不能自动创建),但是为什么我们在这里需要一个移动构造函数?和之间有什么区别:unique_ptra(newA[1]);//-doesn'tworkunique_ptra(newA);//-works 最佳答案 要将unique_ptr与数组分配一起使用,您需

c++ shared_ptr 从 char* 到 void*

我正在尝试将char*字符串传递给将在线程内执行的函数。该函数具有以下原型(prototype):voidf(void*ptr);线程分配由类似于以下的函数进行:voidappend_task(std::function&f,void*data);我想分配一个将在线程内部使用的字符串。现在我有这个:stringname="randomstring";char*str=newchar[name.length()];strcpy(str,name.c_str());append_task(f,static_cast(str));我想放弃手动分配和解除分配内存的义务。我如何使用std::sh

c++ - 可以将右值移动到 shared_ptr 中吗

是否可以将一个右值“移动”到一个shared_ptr中。到目前为止,我尝试过的所有方法都会产生一个拷贝。我想要的使用模式是:classElement{public:Element(conststring&);Element(constElement&)=delete;//deletecopyconstructor//...};classMyCollectionOfElements{public:voidadd(Element&&);//addbyrvalue//...protected:vector>elements;};MyCollectionOfElementselements;e