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

When does std::unique_ptr<A> need a special deleter if A has a destructor?

本文关键字:删除 什么时候 unique 如果 gt lt 析构函数 std ptr      更新时间:2023-10-16

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

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

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

std::unique_ptr<T>的默认

删除器将调用deletestd::unique_ptr<T[]>的默认删除器将调用delete[],这些将相应地调用对象的析构函数。

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

例如

,假设您有一个句柄,例如 FILE*(在 C 中很常见(。这些句柄通常带有某种close方法,并且没有析构函数(因为 C 中没有析构函数(。

struct FileCloser {
    void operator()(FILE* f) { if (f) { fclose(f); } }
};
UniqueFile = std::unique_ptr<FILE, FileCloser>;