0

読んだ後: C++ ポインターの配列: [] を削除または削除しますか? (shai vashid による返信) および http://www.cplusplus.com/forum/beginner/6651/

私は以下を実装しました:

カーネル.h

unsigned int **ConfigMeM;
//.....
~Kernel(){ //destructor
    for (unsigned int i=0; i<MeMSize; i++)
        delete [] MeM[i]; //Valgrind:- Invalid read of size 4
                                       - Invalid free() / delete / delete[] / realloc()
    delete [] MeM; //Valgrind: Invalid free() / delete / delete[] / realloc()

    for (unsigned int i=0; i<_item_tot; i++)
        delete [] ConfigMeM[i]; //Valgrind: Same comments as above
    delete [] ConfigMeM; //Valgrind: same as above
};

カーネル.cpp

//.......
MeM = new unsigned int*[MeMSize];
for (unsigned int i=0; i<MeMSize; i++){
    MeM[i] = new unsigned int[11]; //Valgrind: 14,608 bytes in 332 blocks are definitely lost in loss record 2,021 of 2,036
}
for (unsigned int i=0; i<MeMSize; i++){
    for (int j=0; j<10; j++){
        MeM[i][j] = 0;
    }
}
 //.....
 ConfigMeM = new unsigned int*[_item_tot];
for (unsigned int i=0; i<_item_tot; i++){
    ConfigMeM[i] = new unsigned int[3]; //Valgrind: 1,200 bytes in 100 blocks are definitely lost in loss record 1,131 of 2,036 
}
for (unsigned int i=0; i<_item_tot; i++){
    for (int j=0; j<3; j++){
        ConfigMeM[i][j] = 0;
    }
}
  //.....

何が間違っているのかわかりません。

何か提案はありますか?

ありがとうございました。

4

1 に答える 1

1

私の最善の推測は、クラスが暗黙的に生成されたコピー コンストラクターまたはコピー代入演算子を使用してコピーされているということです。これにより、同じメモリへのポインターを持つ 2 つのオブジェクトが残ります。どちらも破壊時にこのメモリを削除しようとするため、二重削除エラーが発生します。

最も簡単な修正方法は、これらの関数を削除してコピーを防止することです。

Kernel(Kernel const&) = delete;
void operator=(Kernel const &) = delete;

または、古いコンパイラに行き詰まっている場合は、関数本体なしでプライベートに宣言してください。

これらのオブジェクトをコピーする必要がある場合は、これらを実装する必要があります。おそらく、新しいメモリ ブロックを割り当てる「ディープ コピー」を実行するためです。

std::vectorまたは、動的配列を管理する方が簡単な場合があります。これにはすでに正しいコピー セマンティクスがあり、非常に簡単に初期化できます。

std::vector<std::vector<unsigned int>> MeM, ConfigMem;

(MemSize, std::vector<unsigned int>(11));
于 2012-11-27T13:43:03.520 に答える