嗨朋友我在程序执行过程中遇到一个查询,如果出现分段错误,可以自动创建对象的析构函数调用。 我正在编写一个代码并故意创建segmentaion错误以检查析构函数是否会被调用。或者不调用它。
#include<iostream>
using namespace std;
class hello
{
public:
int b;
};
class test
{
public :
hello *ptr;
int a;
void function()
{
ptr = new hello;
}
test()
{
cout<<"constructor called"<<endl;
}
~test()
{
cout<<"destructor called"<<endl;
delete ptr;
}
};
int main()
{
test obj;
obj.function();
obj.a = 500;
test *ptr ;
ptr-> a = 900; //To create segmentation fault
}
输出: 构造函数叫
析构函数未被调用。 所以我无法删除在析构函数
中使用“new”创建的任何对象答案 0 :(得分:1)
test *ptr ;
ptr-> a = 900;
是未定义的行为,因为ptr
是一个悬空指针,所以任何事情都可能发生。可能会或可能不会调用析构函数,一切皆有可能。
要使其指向有效对象,您可以将其指定给obj的地址:
test* ptr = &obj;
要创建新的动态分配对象,可以使用new
:
test* ptr = new test;
但如果你这样做,你将不得不自己处理内存管理:
delete ptr;
答案 1 :(得分:1)
不,不会调用析构函数,因为分段错误是操作系统向程序发送中断以尝试访问受保护内存的结果。中断将暂停程序的执行,并且无法继续执行。