c++ - 当大小为零时,hash_map 在第一次查找时崩溃

标签 c++ hashmap

我是 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/

相关文章:

c++ - 检查基类对象的子类 - 继承

C++,键盘输入监视器

c++ - 括号中的一对数字

java - 使用不正确的值填充 HashMap。

java - 如何将重复数组元素分配为唯一键,并计算相应的整数值?

c++ - 是否可以将 CMFCToolBar 添加到对话框中?

c++ - 我还是不明白 C++ operator new[] (or new[][])

java - 弱 HashMap 在取消引用后会立即释放内存吗?

java - 我如何/可以在 Java 中使用 Hashmap 编写 for each 循环?

java - 如何打印与特定值关联的所有键?