0

マップからポインター要素 (マップ内の値はポインター) を消去しようとしていて、ここでコードを見ました VS、UNIX/Linux で消去した後、STL イテレーターはどうなりますか?

for(map<T, S*>::iterator it = T2pS.begin(); it != T2pS.end(); T2pS.erase(it++)) {
    // wilhelmtell in the comments is right: no need to check for NULL. 
    // delete of a NULL pointer is a no-op.
    if(it->second != NULL) {
        delete it->second;
        it->second = NULL;
    }
}

'delete it->second' が正しいメモリの割り当てを解除するかどうかはわかりません。これは、erase(it++) ステップが既にイテレータを次のオブジェクトに移動しているためです。delete ステートメントに到達するまでに、削除したくない次の要素を指しています。何か不足していますか?

4

2 に答える 2

2

これは期待どおりに機能すると思います。

ループの 3 番目のセクションfor(反復子が消去されてからインクリメントされる場所) は、最初の反復のに実行され、関連する反復ごとに同様に実行されます。したがって、ループの内容で既に「処理」した要素を常に消去しています。

並列例:

for (int i = 0; i < 1; ++i) { ...

ループに入り、インクリメントしてループ条件をチェックするi = 0前にwith を実行します。i

于 2013-04-04T03:18:56.047 に答える
1

別の方法を試してみてください:

while (T2pS.size() > 0) {
  if (T2pS.begin()->second != NULL) {
    delete T2pS.begin()->second;
  }
  T2pS.erase(T2pS.begin());
}
于 2013-04-04T03:58:22.623 に答える