C++ 在分段过程中,可以调用析构函数
嗨,朋友,我在程序执行期间有一个查询,如果出现分段错误,可以调用自动创建对象的析构函数。 我正在编写一个代码,并故意创建segmentaion fault来检查析构函数是否被调用,它是否没有调用C++ 在分段过程中,可以调用析构函数,c++,C++,嗨,朋友,我在程序执行期间有一个查询,如果出现分段错误,可以调用自动创建对象的析构函数。 我正在编写一个代码,并故意创建segmentaion fault来检查析构函数是否被调用,它是否没有调用 #include<iostream> using namespace std; class hello { public: int b; }; class test { public : hello *ptr; int a;
#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
}
#包括
使用名称空间std;
同学们好
{
公众:
int b;
};
课堂测试
{
公众:
你好,ptr;
INTA;
空函数()
{
ptr=新的hello;
}
测试()
{
库特
是未定义的行为,因为ptr
是一个悬空指针,所以任何事情都可能发生。析构函数可以调用,也可以不调用,任何事情都有可能
要使其指向有效对象,可以将其指定给obj的地址:
test* ptr = &obj;
要创建新的动态分配对象,可以使用new
:
test* ptr = new test;
但如果您这样做,您必须自己管理内存:
delete ptr;
不,不会调用析构函数,因为分段错误是操作系统向程序发送中断以尝试访问受保护内存的结果。该中断将停止程序的执行,并且无法继续执行。当程序崩溃时,操作系统将回收该内存无论如何,ory。你错过了逻辑:故意创建segmentaion fault来检查析构函数是否会被调用。我不怪你。@chris但这属于UB。析构函数可以被调用。尽管如此,它背后的想法是让他们能够正确地释放动态分配的内存,这在who中实际上并不重要当然,你可能会争辩说UB会影响操作系统的清理,我想如果你不崩溃的话,它确实会起作用,尽管不能保证超过这一点。它没有被标准定义,但我认为编译器和操作系统的组合将有一个可预测的行为,只要你保证指针是poi不允许使用未分配的内存。@Markransem您不能真正做到这一点。事实上,在释放过程中,指针肯定不会初始化为NULL。如果程序分配了大量内存,或者可用内存很少,那么它指向您实际拥有的内存而不会触发系统信号的可能性相当高。“不,析构函数不会被称为“你怎么知道?当涉及到未定义的行为时,你不能提供任何保证。@LuchianGrigore我相信我的回答的其余部分解释了为什么不应该调用析构函数。不是真的。一致的实现也不会崩溃。那么我应该在哪里释放由“new”创建的内存呢“如果程序出现分段错误或崩溃。正如chris在对您的问题的评论中指出的,操作系统将回收您的程序使用的内存。
delete ptr;