unique_ptr和callable对象释放它的对象

时间:2017-06-25 06:30:43

标签: c++11

这里我有简单的程序:

struct A{
    int t=0;

    operator() (int *p) {cout << "operator() (int *p)\n";delete p;};

    ~A() {cout << "~A\n";};
};

int main(int argc, char** argv) {
    {
        unique_ptr<int, A> u(new int[9]{0});
    }
    return 0;
}

程序在int数组上创建unique_ptr。并使用可调用对象A来销毁指针。一切都很简单。但是当我运行程序时,输出是:

~A
operator() (int *p)
~A

我不明白为什么析构函数会打两次电话。如果有一些想法?

3 个答案:

答案 0 :(得分:1)

unique_ptr按功能获取删除器对象的副本以保留状态,以获取更多信息。

https://stackoverflow.com/a/35318283/4669663

这是我试图确认在创建unique_ptr时为删除器调用复制构造函数的代码,

http://cpp.sh/7yqw2

答案 1 :(得分:0)

在我的计算机上g++ (GCC) 7.1.1 20170516我得到了输出

$ ./test2
operator() (int *p)
~A

使用您的程序。

这取决于您的编译器和标准库实现。可能std::unique_ptr生成A类型对象的附加副本,然后源可能会被破坏。

答案 2 :(得分:0)

在我的搜索中,我发现使用default_delete&lt;&gt;()

会更好
shared_ptr<int> u(new int[9], default_delete<int[]>());