2010-12-11 46 views
1

我是新來的散列圖在c + +。我必須將錶轉換爲hashmap。hash_map第一次查找時大小爲零時崩潰

這是怎麼了我已經宣佈,在我的節目

我使用Microsoft 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也會返回錯誤的指針。這是因爲存在腐敗嗎?能否請你幫忙?

如果是堆腐敗,我該如何避免這種情況?無論如何,我可以說創建一個這個大小的hash_map?

+0

你是否需要使用'hash_map'(或任何非標準容器)?你不能只使用'std :: map'嗎? – birryree 2010-12-11 04:35:18

+0

請注意,hash_map僅適用於Microsoft Visual Studio,您可能會考慮學習未來標準的unordered_map。 – unsym 2010-12-11 04:36:56

回答

5

hash_multimap <const char*, long >不會做你認爲它做的事。關鍵是指針不是一個字符串。編譯器使用相同的內存爲"SwitchId"字符串文字編寫的小程序工作。在一個更大的項目中情況並非如此。

使用std::string作爲關鍵,而在此處切換到std::unordered_multimap

+0

我試圖用std :: string作爲鍵的unordered_multimap,但仍然是應用程序崩潰。我沒有定義任何分配器。包含may的類是動態分配的,我可以覆蓋內存嗎? – mithuna 2010-12-12 07:28:09

+0

「仍然崩潰」的診斷過於廣泛。在C++上閱讀一本書,嘗試調試器,發佈更新後的代碼。 – 2010-12-12 17:07:23