0

これでデータが正しく解放されるかどうかを知りたいだけです。

擬似コード:

std::map<std::string, ClassPointer*>::iterator tempIterator;

    for(tempIterator = directory.begin(); tempIterator < directory.end; 
        tempIterator++)
        delete &tempIterator;
4

3 に答える 3

4

ディレクトリには生のポインターが格納されるため、必要に応じてこれらのポインターを削除するのはユーザーの責任です。

std::map<std::string, ClassPointer*>::iterator tempIterator;

for(tempIterator = directory.begin(); tempIterator < directory.end(); 
    tempIterator++)
{
    delete tempIterator->second;
}

常に、より良い解決策は、STL コンテナーでスマート ポインターを使用することです。

 std::map<std::string, std::shared_ptr<ClassPointer>> directory;
于 2013-01-21T04:30:13.790 に答える
2

ClassPointer*が割り当てられている場合new[]、このコードは正しく機能しない可能性があります。代わりにスマートポインタを使用することをお勧めします。

そして参考までに、それは

for (auto tempIterator = directory.begin(); tempIterator != directory.end(); 
    ++tempIterator)
于 2013-01-21T04:06:24.013 に答える
1

正しい方法は次のとおりです。

for (
    std::map<std::string, ClassPointer*>::iterator it = directory.begin()
  , last = directory.end()     // avoid call to end() every time
  ; it != last                 // use operator != (NOT operator <)
  ; ++it                       // prefer prefix increment for iterators!
  ) delete it->second;         // iterator points to std::pair actually!

または C++11 の方法:

for (auto& item : directory) delete item.second;

ところで、これはクラス ポインタのみを解放し、マップ要素は解放しません! (マップ内のポインターは無効になりましたが、アイテムはマップ内に残ります)

于 2013-01-21T04:11:54.397 に答える