2009-08-11 8 views
1
typedef std::map<int, MyObject*> MyMap; 
MyMap* myMap = new MyMap; 
// ... 
myMap->insert(MyMap::value_type(0, objectOfType_MyObject)); 

なぜ私のコードのクラッシュは、スタックトレースがコードクラッシュSTD `でオブジェクトを格納する:: map`

std::less<int>::operator() 

に下って行くとしますか?

コンパイラを提供する必要があるカスタムキークラスを使用するとわかりますが、これはint型です。

以前は地図を使ったことはありませんでしたが、おそらくダムの質問ですが、私はこれまで何年も前から悩んでいました。私にとって、このコードが動作する

おかげ

+0

スタックトレースはどのようになっていますか? – GManNickG

+0

完全なスタックトレースを提供するか、valgrindを使用してメモリの誤用を検出します:-) –

+0

愚かなコメントかもしれませんが、挿入する前にmyMapオブジェクトを削除していませんか? – Naveen

答えて

11

(&実行をコンパイル):

#include <map> 

class MyObject 
{ }; 

int main(void) 
{ 
    typedef std::map<int, MyObject*> MyMap; 

    MyMap *myMap = new MyMap; 
    MyObject *obj = new MyObject; 

    myMap->insert(MyMap::value_type(0, obj)); 

    delete obj; 
    delete myMap; 
} 

だから問題は、詳細( // ...または MyObjectは何ができるか)、または他の場所にあります。おそらく、少し助けてくれるものを修正することができます。あなたができるときに物事を割り当てることを積み重ねてみてください。実際にマップへのポインタが必要ですか?

#include <map> 

class MyObject 
{ }; 

int main(void) 
{ 
    typedef std::map<int, MyObject*> MyMap; 

    MyMap myMap; 
    MyObject *obj = new MyObject; 

    myMap.insert(MyMap::value_type(0, obj)); 

    delete obj; 
} 

実際にオブジェクトやオブジェクトへのポインタを格納する必要がありますか?

#include <map> 

class MyObject 
{ }; 

int main(void) 
{ 
    typedef std::map<int, MyObject> MyMap; 

    MyMap myMap; 

    myMap.insert(MyMap::value_type(0, MyObject())); 
} 

メモリリークが非常に小さく、ほとんど不可能です。 の場合はポインタを格納する必要があり、多態的な動作の場合はのboost::ptr_container libraryをチェックしてください。

+0

非常に良い答えです。最後のケースでは、MyObjectのコピーコンストラクタも定義する必要があります。 – Indy9000

+0

私の問題は、自分のクラスを初期化するときにマップをクリアしていないことでした。 (サイズ0でも)。 Obj-Cオブジェクトを保存しています – Sam

関連する問題