0

私のクラスには、次の名前のポインターメンバーの汎用配列がありますA

T** A

現在、次の方法でデストラクタの配列を削除します。

~MyQuickInitArray(){
    delete [] A;
};

これによりメモリリークが発生しますか? もしそうなら、配列を反復処理してdelete各オブジェクトを呼び出す必要がありますか?

余談ですが、整数の配列であるか、デストラクタが既にそれを処理しているかdelete [] Bを呼び出す必要がありますか?B

編集:

割り当ては次のように行われます。

MyQuickInitArray(int size)
{
    if(size <= 0)
    {
        throw new std::exception;
    }

    _size = size;
    _counter = 0;
    A = new T*[size];
    B = new int[size];
    C = new int[size];
}
    MyQuickInitArray(const MyQuickInitArray& myQuickInitArray)
    {
        _size = myQuickInitArray._size;
        _counter = myQuickInitArray._counter;
        A = new T*[_size];

        for(int i = 0; i<_size ;i++)
        {
            if(myQuickInitArray.A[i] != NULL)
            {
                A[i] = new T(*myQuickInitArray.A[i]);
            }
        }

        B = myQuickInitArray.B;
        C = myQuickInitArray.C;
    }
4

2 に答える 2

2

これによりメモリリークが発生しますか?

Aがポインターの配列である場合は、確実に信頼できます。配列をループして、ポインターを自分で削除する必要があります。

~MyQuickInitArray {
    for (int i =_size; i--;) {
        delete A[i];
    }
    delete [] A;
}

が整数の配列であるか、デストラクタがそれを処理するかdelete [] Bを呼び出す必要がありますか?B

はい、常に で割り当てられているものを削除してくださいnew。クラスのデストラクタ内でこれを行うことができます。

于 2013-01-27T15:15:13.600 に答える
1

これによりメモリリークが発生しますか?

はい、delete[]個々の要素が指す項目を削除せずにポインターの配列を呼び出すと、メモリ リークが発生します。これは、C++ の「組み込み」ポインターには所有権のセマンティックがないためです。unique_ptr<T>ループ内でのデストラクタの呼び出しを避けるために、たとえば「プレーンな」ポインタの代わりに「スマートな」ポインタを使用することを検討してください。

B が整数の配列の場合、delete [] B を呼び出す必要がありますか

配列の要素の型に関係なく、 でdelete[]割り当てたすべてのものを呼び出す必要があります。new[]

于 2013-01-27T15:14:32.060 に答える