我是 c++ 中的 hash_map 的新手。我必须将表转换为散列图。
这就是我在程序中声明和使用 hash_map 的方式
我正在使用 Microsoft Visual Studio。
#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 吗?
最佳答案
hash_multimap <const char*, long >
不做你认为它做的事。关键是指针而不是字符串。你的小程序能正常工作是因为编译器对 "SwitchId"
使用相同的内存字符串文字。在较大的项目中情况并非如此。
使用 std::string
作为一个键,而在这里,切换到 std::unordered_multimap
.
关于c++ - 当大小为零时,hash_map 在第一次查找时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4415191/