2

クラスのデストラクタ内でクラス属性を削除する際に問題があります。従来の手続き型プログラムで同じことを実行しようとすると、完全に機能します。

しかし、以下のコードを実行しようとすると、デストラクタはdelete「配列」せず、メモリを解放しません:

class MyClass
{
private:
    int *array;
    int n = 2000000;
public:
    MyClass(){
        this->array = new int[n];
        for(int i=0; i<n; i++){
            array[i] = i;
        }
    }
    ~MyClass(){
        delete[] array;
    }
};


int main(int argc, const char * argv[])
{
    MyClass *test = new MyClass;

    delete test;

    return 0;
}

なんで?

4

2 に答える 2

8

**心配しないでください!** (_'Don't Panic'_と言うべきですか?)

クラスのデストラクタ内のdeleteステートメントが実行されると、コンストラクタ内で割り当てられたメモリが解放され、将来使用できるようになります。

これは、クラスをインスタンス化する実際のプロセスに OS によって割り当てられるメモリが削減されることを本質的に意味するものではありません。

追加のヒント: プログラム内の「実際の」メモリ リークを検出するには、 Valgrindなどの適切なツールを使用します。

于 2013-06-27T18:42:12.623 に答える