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