使用 std::shared_ptr 时有效地保存 memory/programming
Conserving memory/programming efficiently when using `std::shared_ptr`
我正在尝试创建一堆共享指针并将它们放入各种容器中。
使用原始指针我想做以下事情:
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;
有关详细信息,请阅读 shared_ptr on cppreference。
我正在尝试创建一堆共享指针并将它们放入各种容器中。
使用原始指针我想做以下事情:
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;
有关详细信息,请阅读 shared_ptr on cppreference。