【问题标题】:Is checking by an exception safe for when array goes out bound?当数组超出范围时,通过异常检查是否安全?
【发布时间】:2016-01-15 19:26:08
【问题描述】:

这是我的代码:

template<class T>
void Matrix<T>::set(const int i, const int j, const T v) {
    try {
        m[i][j] = v;
    } catch (std::exception& e) {
        std::cout << "Standard exception: " << e.what() << std::endl;
    }
}

但是,我在这里是安全的吗?我的意思是,i 和/或j 可能越界,但程序收到分段错误,然后会抛出异常吗?

如果这不是一个好方法,那么我应该使用assert() 吗?

【问题讨论】:

  • “否”对所有问题。 “这取决于”最后一个。
  • @juanchopanza 这不是问题......!
  • 我可以重新打开问题,没问题。副本来自“相关”链接,这意味着不难找到。不要太担心单次否决票,可能有各种各样的原因。
  • @gsamaras 别担心它有时会发生。数组不会引发异常。 C++ 中的错误处理是一个复杂的固执己见的话题(因为从嵌入式到大型机的 C++ 应用程序非常不同)。我建议你看看famous book list,特别是Bjarne's book的第II.13章,这样你就可以找到你自己的真相。
  • Sutter, Alexandrescu -- Coding Standards 是另一个关于 C++ 错误处理的好讨论。

标签: c++ arrays c++11 error-handling indexoutofboundsexception


【解决方案1】:
template<class T>
void Matrix<T>::set(const int i, const int j, const T v) {
    try {
        m[i][j] = v;
    } catch (std::exception& e) {
        std::cout << "Standard exception: " << e.what() << std::endl;
    }
}

您没有提及m 是什么类型,但假设它是在operator[] 中进行边界检查的自定义类型,那么您应该没问题。边界检查将(或应该)发生,并且应该抛出异常,任何越界写入尝试之前。

但请注意,C++ 不会对原始 (C) 数组进行边界检查,其operator[] 实现中的任何标准库类型也不会,所以如果m 是这些类型之一,那么你'永远不会抛出异常。相反,STL 类型提供了一个 at() 方法,如果需要边界检查,您应该使用它。

【讨论】:

    【解决方案2】:

    只需添加边界检查。

    C++ 不对数组进行边界检查,更不用说抛出异常了。

    使用vectors/std::array,您可以使用.at() 方法而不是[] 运算符进行检查。

    最后,GSL 引入了array_view,它允许您添加“零成本注释”,以便分析工具可以进行边界检查。目前还没有出现 GSL 的事实上的标准实现。另见:

    【讨论】:

      【解决方案3】:

      没有。

      仅从数组中读取时,异常检查可能没问题(但一点也不优雅)。

      但是,在编写时,您可能会覆盖“外部”内存,这是一个巨大的安全风险,而且它可能会通过覆盖堆栈帧来改变执行流程,谁知道呢 - 也就是说,肯定存在异常处理程序即使它实际上预计会抛出也不会运行。

      最好的决定是在每次迭代时检查索引。 鉴于您提到了asserting,我想您确实知道要开始的数组维度。

      【讨论】:

      • 是的,谢谢!你觉得这个问题很糟糕吗?
      • 不,实际上。即使对于知道best practices 的人来说,了解正在发生的事情也很重要。
      • 分数是-1,所以有人认为这个问题不好,我想知道为什么。
      • 他们可能想指出您可能首先使用搜索,因为它已被标记为重复,而不是问题本身。
      猜你喜欢
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多