【发布时间】:2019-11-24 20:54:18
【问题描述】:
在下面的代码中,当在destruct类中删除一个基类的对象时,任何类的析构函数都没有被执行。可能是什么原因? “删除 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;
}
我预计任何类中至少有一个析构函数在运行。 请帮助我了解删除运算符在这种情况下的工作方式。
【问题讨论】:
-
UB。您的析构函数不是虚拟的。编辑:忽略这一点,您只是在删除
base。base的析构函数只被调用,但如果你将desObj传递给destructObj它将是 UB。 -
你永远不会
deletedesObj指针,所以该对象不会被破坏。 -
无论何时何地您
deleteobj指针都无关紧要。在另一个函数中或直接在main中,它仍然会被删除。也许您显示的代码没有复制您遇到的问题?这真的是一个正确的minimal reproducible example 可以复制您遇到的问题吗?你展示的程序的输出是什么?你期望什么输出?请花点时间刷新how to ask good questions,以及this question checklist。 -
@Neijwiert 尽管类名为
base,但这里没有继承。 -
Clang 有助于生成
warning: deleting pointer to incomplete type 'base' may cause undefined behavior [-Wdelete-incomplete]。
标签: c++ destructor delete-operator