在删除另一个类中的一个类的对象时析构函数如何工作

how destructor is functioning when deleting a object of one class in other class

本文关键字:工作 析构函数 对象 何工作 另一个 删除 一个      更新时间:2023-10-16

在下面的代码中,当删除析构类中的基类对象时,任何类的析构函数都不会被执行。可能是什么原因?"删除 obj"调用哪个析构函数?

#include <iostream>
using namespace std;
class base;
class destruct{
    public :
    destruct() {
        cout<<"Destruct Constructor called"<<endl;
    }
    void destructObj(base* obj) {
        delete obj;
    }
    ~destruct() {
        cout<<"Destruct Destructor called"<<endl;
    }
};
class base {
    int runs;
    public:
    base(){
        cout<<"Constructor called"<<endl;
    }
    ~base(){
        cout<<"destructor called"<<endl;
    }
};
int main() {
    base *obj = new base();
    destruct *desObj = new destruct();
    desObj->destructObj(obj);
    return 0;
}

我希望至少有一个析构函数运行任何类。请帮助我了解在这种情况下删除运算符的工作方式。

问题是destruct::destructObj需要看到Base的定义才能知道有一个析构函数要调用,但它只有一个前向声明。

将您的代码更改为此代码,它可以工作。

#include <iostream>
using namespace std;
class base;
class destruct{
    public :
    destruct() {
        cout<<"Destruct Constructor called"<<endl;
    }
    void destructObj(base* obj);
    ~destruct() {
        cout<<"Destruct Destructor called"<<endl;
    }
};
class base {
    int runs;
    public:
    base(){
        cout<<"Constructor called"<<endl;
    }
    ~base(){
        cout<<"destructor called"<<endl;
    }
};
// *** this function after base has been defined ***
inline void destruct::destructObj(base* obj) {
    delete obj;
}
int main() {
    base *obj = new base();
    destruct *desObj = new destruct();
    desObj->destructObj(obj);
    return 0;
}

现在这让我感到惊讶,我想知道它是否是 g++ 扩展。当您尝试delete指向只有一个前向声明的类的指针时,我本以为会出现编译器错误。但我可能是错的。

更新:显然这(删除指向不完整类的指针(是未定义的行为,我想这意味着它应该编译。但是,您的编译器确实应该给您一个警告,告诉您存在问题。始终注意编译器警告,并始终启用最大可能的警告数进行编译。

obj是指向不完整类型的指针时,您正在调用delete obj。这是未定义的行为(在实践中,这通常意味着不调用析构函数,但任何事情都可能发生(。

您需要将base的定义向上移动到调用 delete 的函数可见的位置。