2017-12-02 11 views
0

私は、A *検索に使用された未使用のマップでメモリをクリーンアップしようとしています。下のコードは私のマップの1つです。私はそれを働かせることができません、私はいくつかの助けが必要です。ポインタをアンオーダード・マップで削除する

for (std::unordered_map<Tile*, PlannerNode*>::iterator itr = plan_map.begin(); itr != plan_map.end(); ++itr) 
    { 
     delete itr; 
     itr->second = nullptr; 
    } 
+0

これは、順序付けされていないマップの仕組みではありません。順序付けされていないマップのエントリを削除するには、その 'erase()'メソッドを使います。順序付けされていないマップ内の項目を消去すると、消去されたイテレーターは無効になり、ループ内で増分しようとするなど、操作は未定義の動作であり、保証されたクラッシュです。 C++の本を開き、マップや他のコンテナがどのように動作し、それを再読み込みするかを説明する章を開きます。 –

+0

'nullptr'に設定したのと同じものを'削除 'したくありませんか? – Galik

+0

iteratorそれは友人が私にそれをする方法を説明したものですが、それはうまくいかないようです。 –

答えて

0

あなたはポインタのunordered_mapを持っているので、あなたはすなわち、それらにdeleteを呼び出し、彼らが指す領域を解放する必要があります。その後、nullptrに設定するのではなく、マップからeraseに設定します。以下の例が参考になるかもしれません。画面には

Destroying Tile 
Destroying PlannerNode 

が印刷されます。

ポインタを管理するためにRAII構造を使用する方が良いでしょう。 std::unique_ptr。そうすれば、plan_mapは範囲外になり、自動的にすべてのメモリが自動的にクリーンアップされます。

std::unordered_map<std::unique_ptr<Tile>, std::unique_ptr<PlannerNode>> plan_map; 
plan_map.emplace(std::make_unique<Tile>(), std::make_unique<PlannerNode>()); 
+1

ニックピッキングしますが、毎回消去しません。これにより、しきい値を下回った時点で再ハッシュが発生します。私たちがすべての要素を落とすことを考えれば、それは最適ではありません。より良い解決策は、map.clear()に移動することです。 – Pranay

0
std::for_each(plan_map.begin(), plan_map.end(), [](auto& p){delete p.first; delete p.second;}); 
plan_map.clear(); 

これはそれを行うには非常にクリーンな方法で、それはまた不器用なイテレータaritematicを回避することができます。 ラムダ構文を理解することは問題の範囲にはありません。これを理解するにはC++ラムダを調べることをお勧めします。

std::unique_ptr<>を参照すると、あなたとあなたがする必要があるのは、すべて plan_map.clear()となります。

参照:http://en.cppreference.com/w/cpp/algorithm/for_each

関連する問題