【问题标题】:C++: accessing an array of unknown size by using try/catchC++:使用 try/catch 访问未知大小的数组
【发布时间】:2013-06-04 20:56:06
【问题描述】:

我使用 Java 已经有一段时间了,不得不重新使用 C++。之前在C++中使用try/catch的次数不多,现在重新工作的时候,遇到了大概很傻的问题。

我有一个未知大小的数组,想计算出其中存在的所有数字。但是,我不想使用 C++ 向量,这会给我一个确切的大小。我尝试的是有一个不应该自行结束的 for 循环。我想在抛出异常时打破它,我会捕获并处理问题。但是,它不起作用,也不会抛出异常。

有人能告诉我吗? :) 谢谢。

    for(int i = 0; i < 1000; i++) {
       try {
           cout << symbols[i] << " ";
       } catch (int ex) {
           cout << "thrown";
           break;
       }
}

【问题讨论】:

  • “我不想使用 C++ 向量,因为它会给我一个精确的大小。” - 为什么不呢?
  • XY 问题。您可能想要遍历数组的元素,或者找出数组的长度。你确实想在这里使用try-catch(否则它不会起作用)。
  • Ed S. > 我想知道这里有什么问题。
  • 好的,问题是越界访问不一定会导致 C++ 异常。事实上,它甚至不必产生信号。
  • @decas:如果您再考虑一下这种情况,很明显捕获异常对您没有任何帮助。假设您写(我意识到您正在阅读这里,但请耐心等待)到该数组末尾的位置 1 元素。好吧,您可能刚刚覆盖了一个字节或更多其他变量,谁知道呢。您如何才能修复损坏以使您的程序恢复到定义的状态?你不能,所以唯一明智的做法是完全避免这种情况。

标签: c++ arrays exception exception-handling try-catch


【解决方案1】:

未定义的行为意味着任何事情都可能发生。这当然并不意味着“将抛出 X 类型的异常”。您的程序处于未定义状态。即使你能抓住它,你会做什么来解决它?你什么都做不了,你的程序很糟糕。

【讨论】:

    【解决方案2】:

    访问超出范围的数组会导致未定义的行为也不例外。
    未定义的行为意味着程序不再是有效的 C++ 程序,并且可能显示任何行为,无论正确或不正确,但您不能依赖它来保持一致。
    您需要自己跟踪大小并使用该大小进行循环,或者根据需要抛出异常。

    【讨论】:

    • 有什么方法可以检查某个索引处是否有条目而不会崩溃?
    • @decas:是的,你“自己跟踪大小并使用该大小循环”。或者,您知道,编写代码就像您知道如何使用 C++ 并使用 vector。如果它实际上是一个数组并且不是动态分配的,那么您可以使用sizeof
    • @decas 如果数组的大小在编译时修复,您可以处理它。如果是动态分配的,那就不行。
    • 没有。 c 数组绝对没有边界检查。这是留给程序员的。你甚至不能保证你的程序会崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    相关资源
    最近更新 更多