我正在处理其他人的代码,其中包含许多这样的语句
std::auto_ptr<ObjectA> smartptr(new ObjectA(this));
objects_list.push_back(smartptr.get());
smartptr.release();
这甚至有用吗?是否有一些实际的理由在这里使用智能指针而不是只写
objects_list.push_back(new ObjectA(this));
答案 0 :(得分:13)
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
。
答案 1 :(得分:2)
这个想法可能是为了防止内存泄漏,以防向量push_back
抛出。如果需要重新定位向量并且无法分配更多内存,则可能会发生这种情况。
答案 2 :(得分:1)
它提供了异常安全性。在第一个示例中,如果push_back
失败,将删除分配的对象;在第二个例子中,它会泄漏。
请注意,自2011年起,auto_ptr
已被弃用,转而使用unique_ptr
。这样做的好处是它可以存储在向量中,从而减轻了从向量中移除对象时手动删除对象的负担。
答案 3 :(得分:0)
Auto_ptr对于处理内存泄漏非常有用。有关自动指针的详细信息,请参阅以下链接。
http://www.codeproject.com/Articles/23670/auto_ptr-and-its-usage