我的代码如下所示
template <typename KeyType, typename ValueType>
KeyType IDSystem<KeyType,ValueType>::registerParameter(const ValueType& value)
{
KeyType key = __IDCounter++;
_Map[key] = value; //crashes here
return key;
}
其中_Map是
std::map<KeyType, ValueType> _Map;
用于在指示位置崩溃的程序,然后我用
替换了该行_Map.at(key) = value; //out_of_range thrown here
现在程序在同一行抛出一个std :: out_of_range异常......
KeyType是标准库中的int64_t,ValueType是指向某个类的指针(如MyClass *)。
令人惊讶的是,我之前使用过std :: map ......并没有出现任何问题。
我是否正确使用std :: map?请指教。
答案 0 :(得分:2)
答案 1 :(得分:1)
编写的代码(除了可能没有伤害任何内容的下划线名称)是好的,所以问题很可能在其他地方。特别是,如果免费存储已被破坏(通过删除一个非新的指针,或通过运行已分配的块的末尾),症状几乎可以显示在使用免费商店的任何地方。当你给它一个尚未在地图中的密钥时,map::operator[]
使用免费商店,所以我怀疑这就是问题:其他东西已经炸毁了堆。
答案 2 :(得分:1)
out_of_range
例外是一个阅读鲱鱼,与原始崩溃问题不同。
问题在于:
_Map[key] = value;
所以你正在做作业 这表明您有一个错误的赋值运算符(或者您在赋值运算符中执行的操作会遇到其他一些错误的代码)。
由于我们不知道ValueType
是什么,我们无法在此之后诊断问题。我建议您检查一下是否正在实施rule of 3(5) correctly
。
如果您提供ValueType
及其分配运算符的定义,我们可能会进一步提供帮助。通常对于这种类型的问题,最好将问题减少到最小的可编译示例,您可以生成问题并发布该问题。
答案 3 :(得分:1)
问题不在地图上。指向此类的指针未正确初始化,这导致了问题。
感谢您的所有努力,并对这个误导性问题感到抱歉。