0

によると:http://www.cplusplus.com/doc/tutorial/classes/

デストラクタは、コンストラクタの反対の機能を果たします。オブジェクトが破棄されると、オブジェクトの存在範囲が終了した場合 (たとえば、関数内でローカル オブジェクトとして定義され、関数が終了した場合)、または動的に割り当てられたオブジェクトであり、解放された場合に自動的に呼び出されます。演算子 delete を使用します。

コード例:

    class Something
    {
    public:
        Something() {cout << "construction called" << endl; }
        ~Something()    { cout << "destruction called" << endl; }
    };


    void foo(){
        Something *ob = new Something();
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
        foo();
    }
4

2 に答える 2

8

それは本当ですが、オブジェクトを動的メモリに割り当てます。これは、を呼び出すまで破棄されないことを意味しますdelete

これは動的に割り当てられたオブジェクトであり、削除演算子を使用して解放されるためです。

delete を呼び出すことはありません。エルゴ メモリ リークと呼び出されないデストラクタ:

void foo(){
    Something *ob = new Something();
    delete ob;
}

これ、または単にオブジェクトを自動メモリに割り当てます。

void foo(){
    Something ob;
}

または、メモリ管理をスマート ポインターに委任します。

于 2012-09-25T17:06:24.220 に答える
6

デストラクタは、オブジェクトが破棄される前に呼び出されます。でオブジェクトを割り当てたのでnew、手動で明示的に破棄deleteし、オブジェクトへのポインターを呼び出して占有していたメモリの割り当てを解除する必要があります。

自動ストレージでオブジェクトを作成した場合は、

Something ob;

オブジェクトは自動的に破棄され、foo復帰時にオブジェクトが範囲外になるとデストラクタが呼び出されます。

于 2012-09-25T17:06:35.667 に答える