2010-12-11 7 views
1

C++でhash_mapを初めて使用しています。私はテーブルをハッシュマップに変換する必要があります。サイズがゼロのときの最初の検索時にhash_mapがクラッシュする

これは私がマイクロソフトのVisual Studioを使用しています宣言し、私の​​プログラムで

をhash_map使用している方法です。私は別のプログラムとして実行するとき

#include <hash_map> 
using namespace stdext; 
typedef hash_multimap <const char*, long > HEAPTABLE; 

typedef HEAPTABLE::iterator HEAP_ITER; 

class CTest 
{ 

public: 

void setSwitchID(long i); 
long getSwitchID(); 
void isUpgrading(bool bTest); 
private: 

HEAPTABLE m_hashMap; 
}; 

void CTest::setSwitchID(long dwID) 
{ 


HEAP_ITER hIter = m_hashMap.find("SwitchId"); 
if (hIter != m_hashMap.end()) 
{ 
    hIter->second = dwID; 
} 
else 
{ 
    m_hashMap.insert(make_pair("SwitchId", dwID)); 
} 

} 

long CTest::getSwitchID() 
{ 

HEAP_ITER hIter = m_hashMap.find("SwitchId"); 
if (hIter != m_hashMap.end()) 
{ 
    return hIter->second; 
} 
return 0; 

} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    CTest* test = new CTest; 
      if (test) 
      { 

    test->setSwitchID((DWORD)i); 
    test->isUpgrading(false); 
     } 
delete test; 
return 0; 

} 

このコードは正常に動作しますが、私は私のプロジェクトアプリケーションのクラッシュの一部としてそれを実行しようとします。マップにエントリがない場合でも、set関数内のhIterが不良ポインタを返しています。 memeory corruptionのせいか?助けてもらえますか?

ヒープ破損の場合、どうすればこの問題を回避できますか?とにかく、このサイズのhash_mapを作成すると言うことができますか?

+0

'hash_map'(または非標準コンテナ)を使用する必要がありますか? 'std :: map'だけでは使えませんか? – birryree

+0

hash_mapはMicrosoft Visual Studio専用ですので、将来の標準のためにunordered_mapを学ぶことを検討してください。 – unsym

答えて

5

hash_multimap <const char*, long >あなたはそう思わないと思います。キーはポインタの文字列ではありません。小さなプログラムは、"SwitchId"の文字列リテラルと同じメモリを使用するコンパイラの不運によって動作します。これは大規模なプロジェクトでは当てはまりません。

代わりにキーとしてstd::stringを使用し、ここではstd::unordered_multimapに切り替えます。

+0

stord :: stringをキーとしてunordered_multimapを試しましたが、アプリケーションがクラッシュしました。私はアロケータを定義していません。 mayを含むクラスは動的に割り当てられますが、メモリを上書きできますか? – mithuna

+0

"まだクラッシュする"という診断は広すぎます。 C++に関する本を読んで、デバッガを試して、更新されたコードを投稿してください。 –

関連する問題