我正在处理别人的代码,其中包含很多这样的语句
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_ptr
或 shared_ptr
。
关于c++ - auto_ptr、immediate get() 和 release()——有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16689954/