C ++:std :: map抛出一个out_of_range异常

时间:2013-03-02 18:51:28

标签: c++ oop exception map std

我的代码如下所示

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?请指教。

4 个答案:

答案 0 :(得分:2)

您可能希望使用find而不是[]运算符,因为如果您尝试访问不存在的键,它会返回一个过去的迭代器。

关于您的代码,请花点时间发布SSCCE,因为我在上面的几行代码中看不到任何错误。

答案 1 :(得分:1)

编写的代码(除了可能没有伤害任何内容的下划线名称)是好的,所以问题很可能在其他地方。特别是,如果免费存储已被破坏(通过删除一个非新的指针,或通过运行已分配的块的末尾),症状几乎可以显示在使用免费商店的任何地方。当你给它一个尚未在地图中的密钥时,map::operator[]使用免费商店,所以我怀疑这就是问题:其他东西已经炸毁了堆。

答案 2 :(得分:1)

out_of_range例外是一个阅读鲱鱼,与原始崩溃问题不同。

问题在于:

_Map[key] = value;

所以你正在做作业 这表明您有一个错误的赋值运算符(或者您在赋值运算符中执行的操作会遇到其他一些错误的代码)。

由于我们不知道ValueType是什么,我们无法在此之后诊断问题。我建议您检查一下是否正在实施rule of 3(5) correctly

如果您提供ValueType及其分配运算符的定义,我们可能会进一步提供帮助。通常对于这种类型的问题,最好将问题减少到最小的可编译示例,您可以生成问题并发布该问题。

答案 3 :(得分:1)

问题不在地图上。指向此类的指针未正确初始化,这导致了问题。

感谢您的所有努力,并对这个误导性问题感到抱歉。