[英]AutoPointer with objects not allocated on heap
一旦超出范围,自动指针就会在内部指向它所指向的对象调用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
。 技术原因是auto_ptr
析构函数调用delete
且未在堆上分配的对象调用delete
是未定义的行为 ,这可能导致堆崩溃,多次运行析构函数,以及其他您不应依靠且不应推测的事情。
简短的回答-是的。
这意味着您将负责管理内存的责任auto_ptr
给了auto_ptr
。 但是,如果要在自动存储中创建对象,则责任就在于运行时,因此,这不是您的责任。
具有自动存储期限的对象(您所谓的“在堆栈上”)会自动清除。 auto_ptr
存在是为了便于清理分配给new
的对象(它调用指针上的delete
)。 将auto_ptr
与具有自动存储期限的对象一起使用是没有意义的,因为它们没有分配new
。
如果使用std :: auto_ptr,则只能保存在堆上创建的对象。
但是,如果使用例如boost :: shared_ptr,则可以指定一个删除器,该删除器将在对象离开作用域时被调用。 因此,如果您引用堆栈上的对象,则可以使用实际上不执行任何操作的自定义删除器。
有关详细信息,请参见boost :: shared_ptr
从C ++ 11开始不推荐使用std :: auto_ptr
参见C ++ 11 std :: auto_ptr已弃用
这是否意味着我们可以使用auto_ptr
仅保存在堆上创建的对象?
是。
自动对象会自动销毁,因此不需要像智能指针这样的包装器。
请注意,尽管可以使用shared_ptr
或unique_ptr
,这使您可以调用自定义删除函数。 通过使用此自定义删除器功能,可以使用自定义内存分配器,而不是new
的。
auto_ptr
已过时,C ++标准建议unique_ptr
是更好的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.