在另一个 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
的函数可见的位置。
在下面的代码中,当在 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
的函数可见的位置。