自动指针一旦超出范围,就会在内部调用它指向的对象的删除。如果我们分配一个在堆上创建的对象,这可以正常工作。但是,如果我尝试分配一个不是在堆上创建的对象,它会崩溃,因为 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 仅保存在堆上创建的对象?