1

ペアのリストがあります。リストを反復処理して最初と 2 番目の要素を削除するのは良い考えですか? その中のオブジェクトは new で割り当てられます。

list<pair<string,GraphObject*>>* table;
for(i=0; i< length; i++){
    it = table[i].begin();
    while(it != table[i].end()){
        delete (*it).second;
        delete &(*it).first;
    }
}

編集:文字列は新規に割り当てられていません。削除する必要がないことがわかりました。このように2番目を削除しても大丈夫ですか?

4

3 に答える 3

5

あなたの実際の必要性はstd::mapスマートポインターであると思われます

std::map<std::string, std::shared_ptr<GraphObject>> table;

テーブルをクリアするには、次のように記述します。

table.clear();

std::list を使用する必要がある場合でも、スマート ポインターを使用する場合でも、呼び出しtable.clear();てテーブル全体をクリアするだけで済みます。

std::list<std::pair<std::string, std::shared_ptr<GraphObject>>> table;
于 2013-01-08T23:20:46.880 に答える
1

stringはでは割り当てられませんnewのデータ メンバですpair。あなたの2番目deleteはエラーです。

stringで割り当てられたオブジェクトのコピーかもしれませnewんが、そうであれば、元のファイルをずっと前にリークした可能性があります。

new最初の削除では、 で割り当てられたオブジェクトが不要になった場合にのみ削除することをお勧めします。これらのオブジェクトがまだ必要かどうか (つまり、それらへの他のポインターがまだあるかどうか) はわかりません。ただし、スマート ポインターを使用してメモリを管理することをお勧めします。

于 2013-01-08T23:21:08.310 に答える
0

ペアの最初の部分はポインターではないため、削除できません。あなたのコードはコンパイルさえすべきではありません。できることは、完了したらテーブル全体を削除することです。

list<pair<string,GraphObject*>>* table;
for(i=0; i< length; i++){
    it = table[i].begin();
    while(it != table[i].end()){
        delete (*it).second;
    }
}
delete table;

GraphObject*ペアの 2 番目のメンバーを削除する必要があるかどうかについては、他の場所で削除されるポインターの他のコピーがあるかどうかによって異なります。おそらくそうではないので、元のコードは正しいです。別の回答で指摘されているように、代わりにスマートポインターを使用する方が簡単なので、心配する必要はありません。

于 2013-01-08T23:22:14.357 に答える