2017-04-13 97 views
-3

你好,我有一个问题,这个代码如何捕获此异常

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); 
    } 

程序崩溃尝试删除删除的磁盘阵列时。

但我不k 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. 

,该程序可以安全地继续。

+2

请**用[mcve]或[SSCCE(Short,Self Contained,Correct Example)](http://sscce.org)您的问题 – NathanOliver

+0

我更新问题 – trip06

+0

使用'at'而不是''''有出入限制访问的异常。 – Jarod42

回答

2

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

标准将此情况描述为“未定义的行为”。该程序可能会或可能不会崩溃,但即使它没有崩溃,它仍然是一个无效的程序。

对未定义的行为没有任何异常,所以没有什么值得注意的。您唯一能做的就是避免删除已被删除的项目,并避免访问已删除的项目。

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

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

+0

我可以使用矢量,因为在程序运行时(当在descturtor步骤中逐行删除debbug时,一切正常),但只有在关闭程序时才会崩溃。 我需要得到,如果需要数组毁坏或不。我不知道为什么 – trip06

+2

@ trip06在你的程序中某处存在未定义的行为。 “正常工作”只是一种幻想:如果程序在退出之前崩溃,它在某个早期点导致了未定义的行为。这些错误是非常难以发现的。由这些错误引起的行业挫折至少部分是Java,C#等的发明和扩散的原因。你可以尝试用valgrind来捕捉它们,或者通过切换到矢量来避免它们。您也可以同时执行这两个操作,因为向量不会保护您的程序免受各种未定义的行为的影响。 – dasblinkenlight

+0

当我评论/ * * /析构函数工作良好。 – trip06