0

「生産化」するためにいくつかのコードを投げかけられました。メモリ リーク チェッカーを実行したところ、以下の「for」ループ内の次の行がメモリ リークとして呼び出されます。

someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX];
for(int i=0; i<someStruct->mapSizeX; i++){  
    someStruct->arrayMap[i] = new std::list<BasisIndex>[someStruct->mapSizeY];
}

配列マップの宣言方法は次のとおりです。

struct SomeStruct{
    int mapSizeX;
    int mapSizeY;
    std::list<BasisIndex>** arrayMap;
};

いくつかの使用法を次に示します。

someStruct->arrayMap[xVal][yVal].push_back(tempIndex);

for(it = someStruct->arrayMap[xVal][yVal].begin(); it != someStruct->arrayMap[xVal][yVal].end(); it++){
    ...
}

メモリリークチェッカーは、強制終了する前に 5 分間ダンプしました。次に、クリーンアップ ルーチンに次のコードを追加しましたが、それでも 150 個の警告が出力され、すべて先頭の for ループ内のコード行を指しています。

for(int x=0; x<someStruct->mapSizeX; x++){
    for(int y=0; y<someStruct->mapSizeY; y++){
        someStruct->arrayMap[x][y].clear();
        someStruct->arrayMap[x][y].~list();
    }
}

std::list<BasisIndex> ** temp = someStruct->arrayMap;
delete temp;

この配列マップに関連付けられているメモリを完全に削除するにはどうすればよいですか?

4

2 に答える 2

3

割り当てたのと逆の順序でオブジェクトの割り当てを解除します。

割り当て:

someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX];
for(int i=0; i<someStruct->mapSizeX; i++){  
    someStruct->arrayMap[i] = new std::list<BasisIndex>[someStruct->mapSizeY];
}

割り当て解除:

for (int i=0; i<someStruct->mapSizeX; i++){
    delete[] someStruct->arrayMap[i];
}
delete[] someStruct->arrayMap;
于 2011-05-31T22:59:36.037 に答える
3

someStruct->arrayMap[x][y].~list();<-- デストラクタを手動で呼び出さないでください。(placement new が最初に使用されなかったときに、そのようにすることが有効であることさえ知りませんでした...)delete代わりに使用する必要があります。

于 2011-05-31T23:01:28.737 に答える