<A> 如果 A 有析构函数,std::unique_ptr 什么时候需要特殊的删除器?
When does std::unique_ptr<A> need a special deleter if A has a destructor?
如果类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>
的默认删除器将调用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++中返回常量引用是个好主意
- 什么时候调用析构函数
- boost odeint什么时候真正调用观测者
- 编译器对数组声明大小的计算。什么时候发生?
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 您应该在什么时候创建自己的异常类型
- 我什么时候会默认(而不是删除)基类中的复制和移动操作
- 什么时候可以使用常量装饰调用我的重载函数?
- unordered_map什么时候返回 -1?
- QCoreApplication什么时候有效?
- sizeof(size_t) 和 sizeof(ptrdiff_t) 什么时候会有所不同?
- 什么时候用指针调用C++类构造函数
- 我不明白在这个例子中什么时候调用构造函数
- 如果真的需要std::move,我们应该什么时候声明右值refs
- 在编译过程中,琐碎的(没有效果的)代码什么时候会被删除
- 我什么时候应该使用删除?(在动态创建的2D数组之后未删除的后果)
- <A> 如果 A 有析构函数,std::unique_ptr 什么时候需要特殊的删除器?
- 什么时候删除对象?创建对象对c++的影响
- 什么时候我应该在编译前删除目标文件