在删除另一个类中的一个类的对象时析构函数如何工作
how destructor is functioning when deleting a object of one class in other class
在下面的代码中,当删除析构类中的基类对象时,任何类的析构函数都不会被执行。可能是什么原因?"删除 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
的函数可见的位置。
相关文章:
- 在析构函数之后,围绕成员函数的C++lambda包装器是如何工作的
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 程序按执行方式工作,直到我向其添加析构函数为止
- 在删除另一个类中的一个类的对象时析构函数如何工作
- 构造函数和析构函数的工作原理
- 构造函数和析构函数之间的"unexpected"配对。为什么要这样工作?
- C++:析构函数内部如何工作以及谁调用默认析构函数
- 析构函数如何工作
- unique_ptr类型擦除析构函数不能正常工作(带有警告)
- 除以零在虚拟析构函数中工作正常
- 我无法让我的析构函数在我的代码中工作
- C++基于堆栈的构造函数/析构函数无法按预期工作
- 析构函数在c++中的工作方式
- 在虚拟析构函数的情况下,虚拟机制是如何工作的
- std::swap在构造函数、赋值运算符和析构函数方面是如何工作的
- c++中的虚析构函数是如何工作的
- 虚拟析构函数和删除具有多重继承的对象..它是如何工作的
- 析构函数之前可以工作.如何去做
- 代码可以工作,但在析构函数中崩溃(没有复制构造函数)
- C++类析构函数无法正常工作