使用`std :: shared_ptr`时有效节省内存/编程

Nic*_*man 0 c++ memory pointers smart-pointers c++11

我正在尝试创建一堆共享指针并将它们放入各种容器中.

使用原始指针我会考虑做以下事情:

Container a, b, c;
MyClass *ptr;
while(!finishedCreating){
    ptr = new MyClass(SOME_CHANGING_THING);
    a.add(ptr);
    b.add(ptr);
    c.add(ptr);
}
Run Code Online (Sandbox Code Playgroud)

不过,当然,如果我现在想破坏a,bc我需要删除它们所包含的指针.如果我做了以下事情:

~Container{
    delete[] myListOfPointers;
}
Run Code Online (Sandbox Code Playgroud)

在破坏时我会得到一个错误,因为删除a会删除相同的内存b并且c应该删除它.

特别是,输入智能指针std::shared_ptr.我想做一些类似于之前我可以创建单个实体并使用它指向大量内存位置的东西,但我不知道该怎么做?

我想创建一个指向a的指针,std::shared_ptr以便我可以重新分配该指针,例如

std::shared_ptr<MyClass> *ptr = new std::shared_ptr<MyClass>(new MyClass(THING));
Run Code Online (Sandbox Code Playgroud)

Joh*_*han 7

shared_ptr在这里为你分配内存...不要new与他们一起使用!

基本用法是:

std::shared_ptr<MyClass> ptr(new MyClass(THING));
Run Code Online (Sandbox Code Playgroud)

但更好的是:

auto ptr = std::make_shared<MyClass>(THING);
Run Code Online (Sandbox Code Playgroud)

后者为异常处理提供了更多保证,并确保您不再使用new.

您的容器现在将是这样的:

typedef std::vector<std::shared_ptr<MyClass>> Container;
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读cppreference上的shared_ptr.