在另一个 class 中删除一个 class 的对象时,析构函数如何运行

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

在下面的代码中,当在 destruct class 中删除基 class 的对象时,任何 class 的析构函数的 none 都得到 executed.What 可能是这个原因? "delete 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;
}

我预计任何 class 的至少一个析构函数 运行。 请帮助我找出删除运算符在这种情况下的工作方式。

问题是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 指向只有前向声明的 class 的指针时,我会预料到编译器错误。但我可能错了。

更新:显然这个(删除指向不完整class的指针)是未定义的行为,我猜这意味着它应该编译。但是你的编译器真的应该给你一个警告,告诉你有问题。始终注意编译器警告,并始终在启用最大可能警告数的情况下进行编译。

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

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