我知道删除运算符以及它如何自动调用类的析构函数。然而,我最近看到有人直接调用一个类的析构函数,这对我来说似乎很奇怪。所以我写了一个简短的程序,它给出了一个非常出乎意料的结果:
#include <stdio.h>
class A
{
public:
A() {a = new int; *a=42; b=33;}
~A() {delete a;}
int* a;
int b;
};
int main(int argc, const char ** argv)
{
A* myA = new A();
printf("a:%d b:%d\n", *(myA->a), myA->b);
myA->~A();
printf("b:%d\n", myA->b);
printf("a:%d\n", *(myA->a));
}
正如你所看到的,我调用了析构函数~A(),所以在我的预期中,程序在第二次尝试访问变量“a”时应该会崩溃(因为它在两行前被删除了)。相反..程序只是打印这个没有任何抱怨:
a:42 b:33
b:33
a:42
... 为什么?当我直接调用 ~A() 时会发生什么?在任何情况下这样做有用吗?