C++析构函数实际上是否删除了东西?

OLL*_*OLL 1 c++

我知道删除操作符以及它如何自动调用类的析构函数.但是,我最近看到有人直接调用了类的析构函数,这对我来说似乎很奇怪.所以我写了一个简短的程序,给出了一个非常不期望的结果:

#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));
}
Run Code Online (Sandbox Code Playgroud)

所以如你所见,我正在调用析构函数~A(),所以我希望程序在第二次尝试访问变量'a'时会崩溃(因为它在2行之前被删除了).相反..程序只是打印出来没有任何投诉:

a:42  b:33
b:33
a:42
Run Code Online (Sandbox Code Playgroud)

......为什么?当我直接调用~A()时会发生什么?有什么情况可以这么做吗?

Luc*_*ore 9

手动调用析构函数就像调用函数一样 - 执行代码,但释放内存时释放内存,而不是调用delete内存.

a删除后访问将导致未定义的行为,并且似乎可以正常工作.


BЈо*_*вић 5

第二次尝试访问变量“a”时程序应该崩溃

访问已删除的变量是一种未定义的行为。这意味着任何事情都可能发生,包括程序崩溃。

当我直接调用 ~A() 时会发生什么?

在你的例子中什么都没有,因为你没有删除那个对象,但你不应该这样做

有什么情况这样做有用吗?

是的,应该显式调用析构函数以放置 new,这是应该调用析构函数的唯一情况。