我是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吗?
答案 0 :(得分:5)
hash_multimap <const char*, long >
没有按照您的想法行事。关键是指针而不是字符串。您的小程序运行良好的编译器使用相同的内存为"SwitchId"
字符串文字。在较大的项目中情况并非如此。
改为使用std::string
作为密钥,在此处切换为std::unordered_multimap
。