【发布时间】:2012-12-22 07:33:42
【问题描述】:
我知道删除运算符以及它如何自动调用类的析构函数。然而,我最近看到有人直接调用一个类的析构函数,这对我来说似乎很奇怪。所以我写了一个简短的程序,它给出了一个非常出乎意料的结果:
#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”时应该会崩溃(因为它在 2 行前被删除了)。相反.. 程序只是打印出来,没有任何抱怨:
a:42 b:33
b:33
a:42
... 为什么?当我直接调用 ~A() 时会发生什么?有什么情况有用吗?
【问题讨论】:
-
这并不奇怪,如果你打破规则,你就不会得到你期望的结果。不打破规则,你就不会有这些问题。
-
它不必崩溃。它可以让电脑偶尔休息一下。
-
C++ 不是 C。不要在有关 C++ 的问题上使用 [c] 标签。
-
您的问题基本上是“如果这是未定义的行为,为什么它不会使我的计算机爆炸?”请阅读c-faq.com/ansi/experiment.html
-
可能是因为指针仍然指向相同的内存地址,尽管它已被释放(这并不意味着它被归零)?
标签: c++