当同时创建两个对象(一个静态和一个动态)时,析构函数会同时删除它们(当对象超出范围时)?
看看下面的代码块及其输出:
#include <bits/stdc++.h>
using namespace std;
// Destructor (NO return type & NO input parameter)
class Hero{
public:
int health;
// constructor
Hero(){
cout<<"constructor is called"<<endl;
}
// destructor
~Hero(){
cout<<"destructor is called"<<endl;
}
};
int main(){
// static allocation (automatically call destructor)
Hero h1;
// dynamic allocation (manually call destructor)
Hero *h2 = new Hero;
delete h2;
cout << "Size (static) : " << sizeof(h1) << endl;
cout << "Size (dynamic) : " << sizeof(h2) << endl;
return 0;
}
输出:
我有以下两个疑问:
我所知道的关于析构函数的基本知识是,对于动态分配的对象,我们需要手动调用析构函数,而对于静态分配的对象,它是自动调用的。
为什么首先调用动态析构函数?
因为是你先调用的。
h1
的析构函数直到其生命周期结束才运行,该生命周期位于主函数体的末尾(位于 }
处)。
为什么即使在调用析构函数之后,动态分配的对象的大小仍不为零?
您正在检查
Hero*
的大小,无论指针的值如何(即它指向),它总是相同的。