【问题标题】:How catch this exception [closed]如何捕获此异常[关闭]
【发布时间】:2017-09-09 13:06:29
【问题描述】:

您好,这段代码有问题

try {
        double pom = imageHEX[0][0].real();
        if (imageHEX != nullptr) {
            for (int i = 0; i < SIRKA; ++i) {
                delete[] imageHEX[i];
            }
            delete[] imageHEX;
        }
    }
    catch (...) {
        throw Vynimka(3);
    }

尝试删除已删除的数组时程序崩溃。

但我不知道double pom = imageHEX[0][0].real(); 并尝试通过从不存在的索引中读取尝试捕获异常,但我不知道如何调用这些异常。

析构函数在程序工作时工作良好,但在应用程序退出时出现问题。我不知道为什么。

你有想法如何解决这个问题吗?谢谢

/// 我的问题是如何在 catch 块中捕获所有异常。或者尝试从不存在的索引读取时如何捕获异常。

类似于 Java 类异常。 -> 在java中捕获所有异常。

this try {
} catch (...){
 ... something 
}

不行,程序也崩溃了..

这个错误

Exception thrown at 0x000000013F877BF2 in Semestrelka2D.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.

如果有这个异常的处理程序,程序可以安全地继续。

【问题讨论】:

  • 使用 std::vector 而不是分配自己的数组,这使得整个问题变得无关紧要
  • 崩溃也不例外。这不是 Java。
  • @trip06 未定义行为的一种可能结果。 catch (...) 确实会捕获所有 C++ 异常,但访问无效内存不会导致 C++ 异常。在 Windows(您似乎正在使用)上,我相信它会引发结构化异常(Windows 事物)。谷歌“结构化异常处理”,如果那是你所追求的。
  • 注意:Microsoft 的运行时将访问冲突称为“异常”,但这些都是 SEH 异常(MS 等效于 UNIX 信号),而不是 C++ 异常。他们与try/catch无关。

标签: c++ exception destructor


【解决方案1】:

尝试删除已删除的数组时程序崩溃。

标准将这种情况描述为“未定义的行为”。程序可能会崩溃,也可能不会崩溃,但即使不崩溃,它仍然是无效程序。

未定义的行为不会引发异常,因此没有什么可捕获的。您唯一能做的就是避免删除已删除的项目,同时避免访问已删除的项目。

通过内存分析器(例如valgrind)运行您的程序将帮助您识别导致未定义行为的各种内存问题 - 读取或写入超出分配的区域、访问和删除已删除的项目等开。

在您的情况下,切换到std::vector 似乎可以帮助您自动管理资源。

【讨论】:

  • 我可以使用向量,因为程序运行时一切正常(当 descturtor 步骤中逐行调试 2X 时)但只有在我关闭程序时才会崩溃。如果需要数组破坏,我需要获取。我不知道为什么
  • @trip06 这是程序中某处未定义的行为。 “工作良好”只是一种错觉:如果程序在退出之前崩溃,它会在早期的某个时间点导致未定义的行为。众所周知,这些错误很难找到。由这些 bug 引起的行业挫败感至少是 Java、C# 等的发明和扩散的部分原因。您可以尝试使用 valgrind 来捕获它们,或者通过切换到 vector 来避免它们。您也可以两者都做,因为向量不能保护您的程序免受各种未定义行为的影响。
  • 当我评论 /* */ 析构程序运行良好。
  • @trip06 崩溃的原因是不是析构函数。当析构函数运行时,损坏已经造成。程序不崩溃并不意味着它运行良好。内存分析器是您的朋友。
  • @trip06 运行内存分析器,它会告诉你它在哪里。点击 valgrind 的链接,按照它的快速入门指南,运行你的代码,看看问题出在哪里。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2014-07-08
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 2023-03-15
  • 2014-07-15
相关资源
最近更新 更多