auto_ptr,immediate get()和release() - 有用吗?

时间:2013-05-22 10:56:02

标签: c++

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

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

这甚至有用吗?是否有一些实际的理由在这里使用智能指针而不是只写

objects_list.push_back(new ObjectA(this));

4 个答案:

答案 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_ptrshared_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