1

私は地図を持っています

std::map<std::string, my_class*> name2ptr;

最初にマップをトラバースして my_class ポインターを削除し、後でマップをクリアして、マップのコンテンツを削除しようとしました。さて、マップにペアが 1 つしかない場合に問題が発生します。マップには現在 1 つのエントリしかありません

<"ajay", 0xabcd> 

delete((*itr).second) でクラッシュします。for ループは以下のとおりです。

name_map_type::iterator itr;
    for( itr= name2ptr.begin();itr!=name2ptr.end();itr++){
        if((*itr).second){
            delete ((*itr).second);
        }
    }
name2ptr.clear();

どうすればこれを解決できますか?

4

1 に答える 1

3

マップに悪いポインタを入れましたか? nullptrまず、 onをチェックする必要はありません(*itr).seconddeleteing anullptrはまったく問題ありません。何もしません。

std::shared_ptr<my_class>生のポインターではなく、マップの値の型として保存することを検討する必要があります。そうすれば、 を呼び出すだけでname2ptr.clear()、他にオブジェクトへの参照が保持されていない限り、そのオブジェクトは削除されます。

このリファレンスをチェックしてください。

于 2012-12-20T05:49:44.503 に答える