未调用析构函数

Destructors not called

本文关键字:析构函数 调用      更新时间:2023-10-16

为什么不调用析构函数?

即使我已经为 A 类和 B 类编写了析构函数,也没有调用它。


#include<iostream.h>
#include<conio.h>
class A {
    public :
    A() {
        cout<<"nIn A const.";
    }
    ~A() {
        cout<<"nIn A dest.";
    }
};
class B : public A {
    public :
    B() {
        cout<<"nIn B const.";
    }
    ~B() {
        cout<<"nIn B dest.";
    }
};
int main() {
    A a;
    B b;
    getch();
    return 0;
}

为什么不调用构造函数?

一旦退出包含对象的块,堆栈上分配的对象的析构函数就会执行。

如果稍微修改,您的代码将显示在getch()之前调用的析构函数

int main() {
    {
        A a;
        B b;
    }
    getch();
    return 0;
}

在这里,我使用了一对额外的大括号来定义内部块。当块退出时(因此在等待键盘输入之前),在此块中定义的对象将被销毁。

在您的代码中,当 main 正文块退出时调用析构函数,这意味着 AFTER 等待键盘。

g++ 4.6 没有问题

 mahmood@la:~$ g++ -o test test.cpp
 mahmood@la:~$ ./test
 In A const.
 In A const.
 In B const.
 In B dest.
 In A dest.
 In A dest.mahmood@la:~$ 
class A {
public :
A() {
    cout<<"nIn A const.";
}
virtual ~A() {
    cout<<"nIn A dest.";
}
};

解构器应该是virtual的。