0

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

#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”创建的任何对象

4

2 回答 2

1
test *ptr ;
ptr-> a = 900;  

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

为了使它指向一个有效的对象,你可以将它分配给 obj 的地址:

test* ptr = &obj;

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

test* ptr = new test;

但如果你这样做,你将不得不自己处理内存管理:

delete ptr;
于 2012-12-06T05:51:46.413 回答
1

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

于 2012-12-06T05:53:15.353 回答