我正在尝试创建一组共享指针,并将它们放入各种容器中。
使用原始指针,我想做以下事情:
Container a, b, c;
MyClass *ptr;
while(!finishedCreating){
ptr = new MyClass(SOME_CHANGING_THING);
a.add(ptr);
b.add(ptr);
c.add(ptr);
}
当然,现在如果我想销毁a
、b
和c
,我需要删除它们包含的指针。如果我做了以下操作:
~Container{
delete[] myListOfPointers;
}
我在销毁时会遇到错误,因为删除a
会删除b
和c
应该删除的相同内存。
输入智能指针,特别是std::shared_ptr
。我想做一些类似于以前的事情,我可以创建一个实体,并使用它来指向大量的内存位置,但我不确定如何做到这一点?
我想创建一个指向std::shared_ptr
的指针吗?这样我就可以重新分配该指针,比如
std::shared_ptr<MyClass> *ptr = new std::shared_ptr<MyClass>(new MyClass(THING));
shared_ptr
在这里为您分配内存。。。请勿将new
与它们一起使用!
基本用途是:
std::shared_ptr<MyClass> ptr(new MyClass(THING));
但更好的是:
auto ptr = std::make_shared<MyClass>(THING);
后者为异常处理提供了更多的保证,也确保您不再使用new
。
您的集装箱现在将类似于:
typedef std::vector<std::shared_ptr<MyClass>> Container;
有关详细信息,请阅读cppreference上的shared_ptr。