c++ - auto_ptr、immediate get() 和 release()——有用吗?

标签 c++

我正在处理别人的代码,其中包含很多这样的语句

std::auto_ptr<ObjectA> smartptr(new ObjectA(this));
objects_list.push_back(smartptr.get());
smartptr.release();

这个有用吗?在这里使用智能指针而不是仅仅写

有什么实际原因吗?
objects_list.push_back(new ObjectA(this));

最佳答案

objects_list.push_back(new ObjectA(this));

这可能会泄漏内存。让我们看看当我们分解它时会发生什么:

  • new ObjectA(this) 已分配
  • push_back 然后被调用

但是,push_back 可以抛出,如果抛出,您的 new ObjectA 就会泄露。

您向我们展示的 auto_ptr 代码解决了这个问题:如果 push_back 抛出,则指针仍由 auto_ptr 拥有并且不会发生泄漏。


真正的解决方案是将智能指针直接存储在容器中,而不是裸指针(因为容器中的裸指针在确保对象被正确删除时令人头疼)。

不幸的是,在 C++03 中(auto_ptr 的来源,它在 C++11 中已被弃用)无法将 auto_ptr 存储在容器中(图案严重损坏)。可以将 boost::shared_ptr 存储在容器中,或者切换到 C++11 并存储 unique_ptrshared_ptr

关于c++ - auto_ptr、immediate get() 和 release()——有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16689954/

相关文章:

c++ - Qt3D: "Mesh is empty, nothing to load"消息

c++ - double 型上的 SSE vector 运算

c++ - 使用 rapidjson 和 ATL CString

c++ - 异常可以通过异常指针为 "duplicated"吗?

c++ - vector 下标与 odeint 不匹配 (C++)

c++ - MessageBox C++ 错误

C++ odbc 关闭记录集泄漏内存

c++ - 如何在 MSYS 上访问 windows 环境变量?

c++ - 如何让 spirit 的 qi::as_string 与 repeat 一起工作?

c++ - QtCreator : is it possible to debug remote GUI app? (GDB)