是否有任何可能的情况使用标准new
/delete
是不够的,我们需要显式调用析构函数,比如pA->~A()
?
我认为它仅在某些资源管理类中是必需的,但通常是一个坏主意。析构函数在作用域结束时自动调用,那么我为什么要自己显式调用它呢?
一个例子的解释会很棒!
是否有任何可能的情况使用标准new
/delete
是不够的,我们需要显式调用析构函数,比如pA->~A()
?
我认为它仅在某些资源管理类中是必需的,但通常是一个坏主意。析构函数在作用域结束时自动调用,那么我为什么要自己显式调用它呢?
一个例子的解释会很棒!
在 C++11 中,您可以union
使用需要析构函数的 with 类型。由于编译器不跟踪当前处于活动状态的类型,因此在替换当前活动成员或销毁union
.
在 9.5 [class.union] 第 4 段中,标准使用以下示例代码从当前活动成员切换m
到新活动成员n
:
u.m.~M();
new (&u.n) N;
使用显式析构函数调用的另一个实例是使用放置手动构造的对象new
。
假设您尝试使用malloc
/free
兼容的 API(例如,用于与允许指定自定义 C 样式分配器的 C 客户端交互):
void* buf = malloc(sizeof (MyType));
if (buf) {
MyType* foo = new (buf) MyType;
// ...
foo->~MyType();
free(buf);
}
(不过,在这种情况下,最好只使用 a shared_ptr
orunique_ptr
自定义删除器。)