繁体   English   中英

AutoPointer具有未在堆上分配的对象

[英]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_ptrunique_ptr ,这使您可以调用自定义删除函数。 通过使用此自定义删除器功能,可以使用自定义内存分配器,而不是new的。

auto_ptr已过时,C ++标准建议unique_ptr是更好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM