2017-04-13 203 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