shared_ptr会自动释放内存吗?
Will a shared_ptr automatically free up memory?
我需要在这里使用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 时,它会删除该对象。
相关文章:
- 如何在c++中释放内存
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 释放内存(主题模板)时出现问题
- 使用后自动释放内存
- C++ 如何释放内存
- 从函数内对象的向量中释放内存
- C++ 在不释放内存的情况下调用析构函数
- 多个线程之间的获取-释放内存顺序
- C++ - 析构函数只是释放内存还是实际删除对象
- 使用 RAII 替换最终块以释放内存
- 如何通过带有指向基类的指针的删除运算符释放内存
- 代码中的"sprintf"用法是否需要释放内存?
- C++何时使用 delete[] 并正确释放内存?
- 为什么此获取和释放内存围栏不能给出一致的值?
- 抛出新表达式的参数子表达式时释放内存
- 在这种情况下,如何释放内存?
- 在 c++ 中应按什么顺序释放内存?