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

火焰

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

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

既然default_deleter<>会打电话delete,那应该是我的理解~A()但是,Josuttis(C ++ Standard Library:A Tutorial and Reference)书的“相关资源的删除”下的5.2节中打开和关闭目录的示例表明,可能需要声明一个特殊的删除器才能执行此操作这,所以让我感到困惑。...这是因为在给定的示例中,该类DIR没有使用的析构函数closedir(...)

马修M.

默认的delete的std::unique_ptr<T>will调用delete和默认的delete的std::unique_ptr<T[]>will调用delete[],那些将适当地调用对象的析构函数。

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果需要存储删除器,unique_ptr如何没有开销?

unique_ptr :: release()是否调用析构函数?

为什么unique_ptr的auto_ptr有重载?

具有std :: unique_ptr的容器的访问器函数

为什么要为具有非平凡析构函数的类声明constrexpr构造函数(例如unique_ptr,std :: variant)

没有op删除unique_ptr

std :: unique_ptr尝试引用已删除的函数

为什么来自unique_ptr析构函数的异常会终止程序?

是否可以保证std :: unique_ptr删除顺序?

奇怪的错误:当未真正创建指针时,使用删除的函数'std :: unique_ptr <_Tp,_Dp> :: unique_ptr

使用什么std :: optional或std :: unique_ptr

使用std :: unique_ptr <T>&代替std :: unique_ptr <T>有什么优势吗?

std :: unique_ptr析构函数构造函数顺序

使用unique_ptr保护的析构函数

是unique_ptr构造函数初始化原始指针,还是unique_ptr析构函数删除关联的原始指针?

使用已删除的函数unique_ptr

如果未使用shared_ptr定义虚拟析构函数,有什么好处?

为什么在使用unique_ptr时没有调用析构函数?

函数(通过std :: move)返回的unique_ptr什么时候超出范围

std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

删除函数unique_ptr

unique_ptr有什么意义?

unique_ptr析构函数的优势

带有 lambda 删除器的 Unique_ptr

如何使用删除器调用unique_ptr构造函数?

unique_ptr 的有状态自定义删除器

如何允许 std::unique_ptr 访问类的私有析构函数或使用私有析构函数实现 C++ 工厂类?

unique_ptr 两次调用析构函数

为什么我需要移动 `std::unique_ptr`

TOP 榜单

热门标签

归档