【问题标题】:Subscript of vector is sometimes out of range向量的下标有时超出范围
【发布时间】:2013-03-19 22:01:38
【问题描述】:

我有一个遗传算法程序,一切都是使用向量动态分配的。编译时没有设置每代的代数或个体数。

我尝试了 500、1000、2000 代,运行完美。然后我尝试了10,000代。它给了我调试断言失败,第 4966 代向量下标超出范围。

我用同样的参数再试了两次,10000代,运行正常。

我又试了一次,7565代报错。

奇怪的是,有时它工作得很好,有时我得到错误。特别是考虑到一切都是使用向量完成的。

关于问题可能来自哪里的任何想法?也许调试模式有问题?

【问题讨论】:

  • 问题来自您的代码中的错误。如果没有看到您的任何代码,很难猜出它可能是什么。
  • 您是否对向量进行零初始化?如果没有,您可能会根据随机数据做出决策。也许使用 Valgrind?
  • “奇怪的是,有时它工作得很好,有时我得到错误” - 不,不是。我的错误有很多。请给我们看代码。
  • 您是否尝试过在调试器中运行您的代码?您是否尝试过使用内存检查器,例如valgrind
  • 这可能是由于向量内存的重定位导致的,这仅在特定大小上触发,这取决于您的 STL。确保您没有假设手头的数据在可能使迭代器、引用无效的向量操作中有效。

标签: c++ vector subscript


【解决方案1】:

问题来自堆栈损坏或很可能来自索引越界访问。在某些情况下您的代码崩溃表明存在问题。如果您的代码是多线程的,则问题可能是因为如果按给定顺序执行操作,您的代码将尝试访问超出向量范围的内容。

我的建议是使用valgrind 运行您的代码,看看它会说什么。通常它有助于解决类似的问题。

另请注意,在某些情况下您的代码不会崩溃,这并不意味着它可以完美运行。您可能仍有堆栈损坏或类似情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多