这里我有简单的程序:
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
我不明白为什么析构函数会打两次电话。如果有一些想法?
答案 0 :(得分:1)
unique_ptr按功能获取删除器对象的副本以保留状态,以获取更多信息。
https://stackoverflow.com/a/35318283/4669663
这是我试图确认在创建unique_ptr时为删除器调用复制构造函数的代码,
答案 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[]>());