1. 程式人生 > >Visual Studio除錯時,出現“觸發一個斷點”

Visual Studio除錯時,出現“觸發一個斷點”

問題描述:

Visual Studio編譯程式碼順利通過,除錯程式碼時出現“已觸發一個斷點”,如下圖:


原始碼類似:


分析:

在F11單步除錯

delete[] send_data;

這行時,發現記憶體釋放出現異常,導致出現“以觸發一個斷點”。很有可能是緩衝區溢位。


知識點:

緩衝區溢位:緩衝區溢位是指當計算機向緩衝區內填充資料位數時超過了緩衝區本身的容量溢位的資料覆蓋在合法資料上,理想的情況是程式檢查資料長度並不允許輸入超過緩衝區長度的字元,但是絕大多數程式都會假設資料長度總是與所分配的儲存空間相匹配,這就為緩衝區溢位埋下隱患.作業系統所使用的緩衝區 又被稱為"堆疊". 在各個操作程序之間,指令會被臨時儲存在"堆疊"當中,"堆疊"也會出現緩衝區溢位。

棧溢位:棧溢位就是緩衝區溢位的一種。 由於緩衝區溢位而使得有用的儲存單元被改寫,往往會引發不可預料的後果。程式在執行過程中,為了臨時存取資料的需要,一般都要分配一些記憶體空間,通常稱這些空間為緩衝區。如果向緩衝區中寫入超過其本身長度的資料,以致於緩衝區無法容納,就會造成緩衝區以外的儲存單元被改寫,這種現象就稱為緩衝區溢位。

棧溢位是緩衝區溢位的一種。

解決辦法:

將緩衝區大小變大,擴大十倍;

#define FILE_BUFFER_LENGTH 30000

重新編譯,成功;在delete[] send_data;行設定斷點,單步除錯,順利釋放記憶體。