为动态分配的对象调用手动析构函数后,对象仍然存在吗?

问题描述 投票:0回答:1

当同时创建两个对象(一个静态和一个动态)时,析构函数会同时删除它们(当对象超出范围时)?

看看下面的代码块及其输出:

#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;
}

输出:

我有以下两个疑问:

  1. 为什么首先调用动态析构函数?
  2. 为什么即使在调用析构函数之后,动态分配的对象的大小仍不为零?

我所知道的关于析构函数的基本知识是,对于动态分配的对象,我们需要手动调用析构函数,而对于静态分配的对象,它是自动调用的。

c++ oop dynamic-memory-allocation destructor
1个回答
0
投票

为什么首先调用动态析构函数?

因为是你先调用的。

h1
的析构函数直到其生命周期结束才运行,该生命周期位于主函数体的末尾(位于
}
处)。

为什么即使在调用析构函数之后,动态分配的对象的大小仍不为零?

您正在检查

Hero*
的大小,无论指针的值如何(即它指向),它总是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.