作為乙個菜鳥,經常遇到程式異常終止,然後彈出這樣乙個框的情況:底層因為接受到作業系統訊號而停止的解決
後來解決這樣的問題多了,就發現了乙個共性,他們基本上都是由於記憶體管理問題而產生的。
問題產生:
呼叫已經釋放了記憶體的物件指標。
例如: qwidget *widget = new qwiget;//申請記憶體空間
delete widget; //釋放記憶體空間
widget->show(); //又來呼叫這個物件
這時就會產生上面的這種異常處理。
解決辦法:
異常終止時,程式一般都會停在導致程式死掉的語句上。按上面的例子,就會停在:
widget->show();這一行,只要仔細檢查這一行裡涉及的指標,記憶體空間,就能發現問題所在並解決。
避免問題的產生:
首先是要有嚴密的思維,呼叫每乙個指標的時候,都要考慮此刻它是否可能已經被釋放了。然後可以運用除錯巨集幫助避免這種問題:q_check_ptr()
這是乙個檢查指標的巨集,如果指標被釋放,或是為0就會在應用程式輸出中看到產生這個問題的**的行,從而幫助除錯。如果有使用除錯巨集q_assert q_check_ptr 以及qt除錯類qdebug、qworning的習慣,除錯**就會更容易。
作業系統訊號
在 posix 相容的平台上,sigkill 是傳送給乙個 程序來導致它立即終止的訊號。sigkill 的符號常量 在標頭檔案 signal.h 中定義。因為在不同平台上,訊號數字可能變化,因此符號訊號名被使用,然而在大量主要的系統上,sigkill 是訊號 9。當sigkill 被傳送給乙個程式時...
作業系統 訊號(2)
作業系統中,訊號的產生可以告訴系統要去執行某個操作。作業系統中有預設的訊號處理函式。我們也可以更改預設的訊號處理函式,由我們自己寫。訊號捕捉 我們先來看看訊號在核心中是怎樣的 訊號對於作業系統來說,分為3類 1.阻塞訊號 2.未決訊號 3.忽略 每個訊號都有兩個標誌位分別為阻塞 block 和未決 ...
Linux作業系統 訊號
1 訊號 乙個很短的訊息,可以被傳送到乙個或一組程序,通常是乙個數,以此來標識訊號。2 1 31編碼了常規訊號 不排隊,連續傳送多次,只有乙個有效 32 64編碼了實時訊號 必須排隊,以便接受多個訊號 3 訊號 隨時被傳送給乙個狀態不可預知的程序,傳送給非執行程序必須有核心儲存,直到程序恢復執行。阻...