c – 如果A有析构函数,std :: unique_ptr什么时候需要特殊的删除器?

如果unique_ptr< A>中的A类它是自己的析构函数,是否有必要声明一个删除器以确保唯一指针使用该析构函数?我想到的例子是A有一个类型为user_matrix的成员mx(我刚刚编写的一个名字)需要调用一个函数free(…)来释放它的内存,一个人会定义

~A(){ user_matrix::free(mx); /*etc*/}

由于default_deleter<>将调用delete,这是我的理解,应该使用~A().但是,Josuttis(C标准库:教程和参考)一书中第5.2节“关联资源的删除”下的目录打开和关闭的示例表明,可能需要声明一个特殊的删除器来执行这个,所以我很困惑….这是因为,在给定的例子中,类DIR没有使用closedir(…)的析构函数?

最佳答案
std :: unique_ptr< T>的默认删除器将调用delete和std :: unique_ptr< T []>的默认删除器将调用delete [],这些将适当地调用对象的析构函数.

可能发生的是,需要在销毁之前安排一个操作,因为析构函数不完整(或缺少)或者因为您想要执行更多操作(例如,某些日志记录).在这种情况下,您需要一个专用的删除器来实现此目的.

例如,假设您有一个句柄,例如FILE *(C中常见).这些句柄通常带有某种类型的close方法,没有析构函数(因为C中没有).

struct FileCloser {
    void operator()(FILE* f) { if (f) { fclose(f); } }
};

UniqueFile = std::unique_ptr<FILE, FileCloser>;

转载注明原文:c – 如果A有析构函数,std :: unique_ptr什么时候需要特殊的删除器? - 代码日志