3

是否有任何可能的情况使用标准new/delete是不够的,我们需要显式调用析构函数,比如pA->~A()

我认为它仅在某些资源管理类中是必需的,但通常是一个坏主意。析构函数在作用域结束时自动调用,那么我为什么要自己显式调用它呢?

一个例子的解释会很棒!

4

2 回答 2

7

在 C++11 中,您可以union使用需要析构函数的 with 类型。由于编译器不跟踪当前处于活动状态的类型,因此在替换当前活动成员或销毁union.

在 9.5 [class.union] 第 4 段中,标准使用以下示例代码从当前活动成员切换m到新活动成员n

u.m.~M();
new (&u.n) N;
于 2013-09-01T00:17:59.150 回答
6

使用显式析构函数调用的另一个实例是使用放置手动构造的对象new

假设您尝试使用malloc/free兼容的 API(例如,用于与允许指定自定义 C 样式分配器的 C 客户端交互):

void* buf = malloc(sizeof (MyType));
if (buf) {
    MyType* foo = new (buf) MyType;
    // ...
    foo->~MyType();
    free(buf);
}

(不过,在这种情况下,最好只使用 a shared_ptrorunique_ptr自定义删除器。)

于 2013-09-01T00:19:12.967 回答