【问题标题】:C++: std::map throws an out_of_range exception [closed]C ++:std :: map引发out_of_range异常[关闭]
【发布时间】:2013-03-02 18:51:27
【问题描述】:

我的代码如下所示

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

【问题讨论】:

  • out_of_range 如果地图中尚不存在密钥:cplusplus.com/reference/map/map/at
  • 就目前而言,您的代码具有未定义的行为,因为__IDCounter_Map 都保留用于实现。
  • @SamerAfach:我的意思是你不能使用这些名字。
  • @Samer 阅读此链接:stackoverflow.com/a/228797/507606
  • @SamerAfach:“规则(在 C++11 中没有改变):”。这也会影响 C++03。

标签: c++ oop exception map std


【解决方案1】:

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

关于你的代码,请花点时间发SSCCE,因为我看不出上面几行代码有什么问题。

【讨论】:

  • 其实我想给那个键赋值。 operator[] 不应该这样做吗?
  • @Samer 是的,operator[] 正是这样做的,因此您的代码有什么问题并不明显。 SSCCE 对我们很有帮助。
  • 好的,谢谢。我试试看能不能做出这样的例子!
【解决方案2】:

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

感谢您的所有努力,并对误导性问题深表歉意。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      out_of_range 异常是一个误读,与您原来的崩溃问题不同。

      问题是当你这样做时:

      _Map[key] = value;
      

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-15
        • 2017-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多