C++ std::unique_ptr<;何时开始;A>;如果有析构函数,是否需要特殊的删除程序?
如果C++ std::unique_ptr<;何时开始;A>;如果有析构函数,是否需要特殊的删除程序?,c++,destructor,unique-ptr,delete-operator,C++,Destructor,Unique Ptr,Delete Operator,如果unique\u ptr中的类A是自己的析构函数,是否需要声明一个deleter以确保唯一指针使用该析构函数?我想到的例子是,A有一个mx类型的user\u matrix(我刚刚编的一个名字),它需要调用一个函数free(…)来释放它的内存 ~A(){ user_matrix::free(mx); /*etc*/} 由于default\u deleter将调用delete,我的理解是应该使用~A()。然而,在第5.2节的目录中打开和关闭目录,在JoutTuy(C++标准库:教程和参考书)下
unique\u ptr
中的类A
是自己的析构函数,是否需要声明一个deleter以确保唯一指针使用该析构函数?我想到的例子是,A
有一个mx
类型的user\u matrix
(我刚刚编的一个名字),它需要调用一个函数free(…)
来释放它的内存
~A(){ user_matrix::free(mx); /*etc*/}
由于
default\u deleter
将调用delete
,我的理解是应该使用~A()
。然而,在第5.2节的目录中打开和关闭目录,在JoutTuy(C++标准库:教程和参考书)下的“相关资源的删除器”下建议一个可能需要声明一个特殊的删除器来做这件事,所以我很困惑…这是因为在给定的示例中,类DIR
没有使用closedir(…)
的析构函数吗?std::unique\u ptr的默认删除器将调用delete
,而std::unique\u ptr的默认删除器将调用delete[]
这些函数将适当地调用对象的析构函数
可能发生的情况是,需要在销毁之前安排一个操作,这可能是因为析构函数不完整(或缺少),也可能是因为您想做更多的事情(例如,一些日志记录)。在这种情况下,您需要一个专用的删除程序来实现这一点
例如,假设给您一个句柄,例如FILE*
(在C中很常见)。这些句柄通常带有某种类型的close
方法,并且没有析构函数(因为C中没有析构函数)
struct FileCloser{
void操作符()(文件*f){if(f){fclose(f);}
};
UniqueFile=std::unique\u ptr;
delete
调用std::unique_ptr
将调用析构函数。请记住:delete
当您new
ed时,delete[]
当您new[]
ed。对其他类型的资源也要这样做。可能是相关的:一种情况是,您需要一个特殊的删除器,用于为您提供指向某个资源的指针的API,而另一种情况则要求您通过另一个函数调用来释放资源。
struct FileCloser {
void operator()(FILE* f) { if (f) { fclose(f); } }
};
UniqueFile = std::unique_ptr<FILE, FileCloser>;