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