shared_ptr会自动释放内存吗?

时间:2012-10-03 16:42:14

标签: c++ memory-management shared-ptr

我需要在这里使用shared_ptr,因为我无法更改API。

Foo1 *foo1 = new Foo1(...);
shared_ptr<Foo2> foo2(foo1);

这里的shared_ptr是否会处理释放foo1使用的内存?如果我理解正确,我不应该在foo1上调用delete吗?

3 个答案:

答案 0 :(得分:12)

是。你是对的,但初始化foo2的正确方法是:

std::shared_ptr<Foo2> foo2 = std::make_shared<Foo1>();  

Herb Sutter在此处讨论了您应该使用std::make_shared<>()的原因: https://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/

答案 1 :(得分:3)

你不应该在foo1上调用delete。

最好不要创建foo1。只有foo2:

shared_ptr<Foo2> foo2(new Foo1(...));
  

std :: shared_ptr是一个智能指针,通过指针保留对象的共享所有权。

如果您不需要共享此指针,请考虑使用std::unique_ptr

  

std :: unique_ptr是一个智能指针:保留一个人的唯一所有权   对象通过指针,并在销毁时指向对象   unique_ptr超出范围。

答案 2 :(得分:1)

正确。智能指针提供所有权语义。特别是,std::shared_ptr提供的语义是这样的,一旦指向它的最后一个shared_ptr被销毁,该对象将被删除。 shared_ptr保留引用计数(引用该对象的shared_ptr个),当它达到0时,它会删除该对象。