Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在另一个类中删除一个类的对象时析构函数的工作方式_C++_Destructor_Delete Operator - Fatal编程技术网

C++ 在另一个类中删除一个类的对象时析构函数的工作方式

C++ 在另一个类中删除一个类的对象时析构函数的工作方式,c++,destructor,delete-operator,C++,Destructor,Delete Operator,在下面的代码中,当在析构函数类中删除基类的对象时,没有任何类的析构函数被执行。原因可能是什么?“delete obj”正在调用哪个析构函数 #include <iostream> using namespace std; class base; class destruct{ public : destruct() { cout<<"Destruct Constructor called"<<endl; }

在下面的代码中,当在析构函数类中删除基类的对象时,没有任何类的析构函数被执行。原因可能是什么?“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;
}
#包括
使用名称空间std;
阶级基础;
类析构函数{
公众:
自毁{

cout问题是
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;
}
#包括
使用名称空间std;
阶级基础;
类析构函数{
公众:
自毁{

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


您需要将
base
的定义向上移动到调用
delete

UB的函数可见的位置。您的析构函数不是虚拟的。编辑:忽略这一点,您只是在删除
base
base
的析构函数,但如果要将
desObj
传递给
destructObj
它,则只调用它将是UB。您从不
删除
desObj
指针,这样该对象就不会被破坏。而且无论何时何地
删除
obj
指针都无关紧要。在另一个函数中或直接在
main
中,它仍然会被删除。也许您遇到的问题不会被co复制de you show?这真的是复制您的问题的正确方法吗?您显示的程序的输出是什么?您期望的输出是什么?请花一些时间刷新,以及。@Neijwiert,尽管类名
base
这里没有继承。Clang有助于生成
警告:删除指向未完成的指针类型“base”可能导致未定义的行为[-Wdelete complete]谢谢john for,伟大的解释!!这是不是意味着删除操作符释放了Objo的内存,但是基类的析构函数会因为你提到的原因而不执行?@ AujjBaji,很显然你的情况是怎样的。但是所有C++标准都说,行为是未定义的,这意味着任何一个g可能发生。