【发布时间】:2012-05-23 23:15:28
【问题描述】:
一旦超出范围,自动指针在其指向的对象上内部调用 delete。如果我们分配一个在堆上创建的对象,这可以正常工作。但是,如果我尝试分配一个不是在堆上创建的对象,它会崩溃,因为 delete 被调用了两次。首先是 auto_ptr 本身,其次是当对象超出范围时,它的析构函数被再次调用。 如下图,
#include <iostream>
#include <memory>
using namespace std;
class sample
{
public:
sample() { puts("sample"); }
~sample() { puts("~sample"); }
};
int main()
{
sample sObj;
auto_ptr<sample> samplePtr(&sObj);
}
这是否意味着我们可以使用 auto_ptr 仅保存在堆上创建的对象?
【问题讨论】:
-
您基本上是对的,但更好的办法是不要使用
auto_ptr(而是使用unique_ptr、shared_ptr等):它已被证明是错误的来源,在新版本中已被弃用标准。 -
为什么要将堆栈对象存储在
auto_ptr中?像auto_ptr这样的智能指针类的全部意义在于它们最终删除了自己拥有的对象...... -
@Vlad,unique_ptr 是更好的通用替代品,仅在需要时才使用 shared_ptr。
-
因为 delete 被调用了两次而崩溃 不,它崩溃是因为 auto_ptr 试图在一个不是使用
new分配的指针上的delete,而不是因为 double删除。 -
@RajeevMehta:是的,但您需要了解调用析构函数和
delete之间存在区别。当堆栈上分配的对象超出范围时,将调用其析构函数,但不是通过delete。delete仅针对使用new分配的内存调用。
标签: c++