gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:13 24 4
gpt4 key购买 nike

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

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

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

最佳答案

std::unique_ptr<T>的默认删除器会调用deletestd::unique_ptr<T[]> 的默认删除器会调用delete[]那些将适本地调用对象的析构函数。

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com