0

我有一个如下所示的代码

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

4 回答 4

3

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

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

于 2013-03-02T18:58:31.437 回答
3

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

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

于 2013-03-02T20:21:48.973 回答
1

编写的代码(除了可能不会伤害任何东西的下划线名称)很好,所以问题很可能在其他地方。特别是,如果空闲存储已损坏(通过删除未更新的指针,或通过运行已分配块的末尾),则症状几乎会出现在使用空闲存储的任何地方。map::operator[]当你给它一个不在地图中的键时使用免费存储,所以我怀疑这就是问题所在:其他东西已经炸毁了堆。

于 2013-03-02T19:26:17.740 回答
1

例外是阅读鲱鱼,out_of_range与您原来的崩溃问题不同。

问题是当你这样做时:

_Map[key] = value;

所以你正在做一个任务。
这表明您有一个错误的赋值运算符(或者您在赋值运算符中所做的某事遇到了其他一些错误的代码)。

由于我们不知道是什么ValueType,因此我们无法诊断超出这一点的问题。我可以建议您检查您是否正在实施rule of 3(5) correctly.

如果您提供定义ValueType及其赋值运算符,我们可能会提供进一步的帮助。通常对于此类问题,最好将问题简化为生成问题并发布的最小可编译示例。

于 2013-03-02T19:32:17.587 回答