当size为零时,hash_map在第一次查找期间崩溃

时间:2010-12-11 04:25:05

标签: c++ hashmap

我是c ++中hash_map的新手。我必须将表转换为hashmap。

这就是我在程序中声明和使用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吗?

1 个答案:

答案 0 :(得分:5)

hash_multimap <const char*, long >没有按照您的想法行事。关键是指针而不是字符串。您的小程序运行良好的编译器使用相同的内存为"SwitchId"字符串文字。在较大的项目中情况并非如此。

改为使用std::string作为密钥,在此处切换为std::unordered_multimap