shared_ptr会自动释放内存吗?

Will a shared_ptr automatically free up memory?

本文关键字:释放 内存 ptr shared      更新时间:2023-10-16

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

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

这里的shared_ptr将处理释放 foo1 使用的内存吗?如果我理解正确,我不应该在 foo1 上调用删除对吗?

是的。您是对的,但初始化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/

你不应该在foo1上调用delete。

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

shared_ptr<Foo2> foo2(new Foo1(...));
  • 标准::shared_ptr: http://en.cppreference.com/w/cpp/memory/shared_ptr

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

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

  • 标准::unique_ptr: http://en.cppreference.com/w/cpp/memory/unique_ptr

std::unique_ptr 是一个智能指针,它: 保留对 对象通过指针,并在 unique_ptr超出了范围。

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