在分段期间,错误可以调用析构函数

During Segmentation fault can destructor called

本文关键字:调用 析构函数 错误 分段      更新时间:2023-10-16

嗨,朋友,如果在程序执行过程中发生分段错误,我有一个查询,可以调用自动创建对象的析构函数吗?我正在编写一个代码并故意创建分段错误来检查析构函数是否会被调用。

#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
    }

输出:调用的构造函数

未调用析构函数。所以我无法删除在 destructor

test *ptr ;
ptr-> a = 900;  

是未定义的行为ptr因为它是一个悬空的指针,所以任何事情都可能发生。析构函数可能会被调用,也可能不会被调用,一切皆有可能。

要使其指向有效对象,可以将其分配给 obj 的地址:

test* ptr = &obj;

要创建新的动态分配对象,可以使用new

test* ptr = new test;

但是如果你这样做,你必须自己处理内存管理:

delete ptr;

不,不会调用析构函数,因为分段错误是操作系统向程序发送中断以尝试访问受保护的内存的结果。 中断将停止程序的执行,并且无法继续。