0

こんにちは、私はプログラムの実行中に 1 つのクエリを持っています。セグメンテーション違反が発生した場合、自動作成されたオブジェクトのデストラクタを呼び出すことができます。私は1つのコードを書いており、意図的にセグメンテーション違反を作成して、デストラクタが呼び出されるかどうかを確認しています。

#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

いいえ、デストラクタは呼び出されません。セグメンテーション違反は、保護されているメモリにアクセスしようとするためにオペレーティング システムがプログラムに割り込みを送信した結果であるためです。割り込みはプログラムの実行を停止し、それ以上続行できなくなります。

于 2012-12-06T05:53:15.353 に答える
1
test *ptr ;
ptr-> a = 900;  

は未定義の動作です。ptrこれはダングリング ポインターであるため、何でも起こり得るからです。デストラクタは呼び出される場合と呼び出されない場合があり、何でも可能です。

有効なオブジェクトを指すようにするには、それを obj のアドレスに割り当てます。

test* ptr = &obj;

新しい動的に割り当てられたオブジェクトを作成するには、次を使用できますnew

test* ptr = new test;

ただし、これを行う場合は、自分でメモリ管理を行う必要があります。

delete ptr;
于 2012-12-06T05:51:46.413 に答える