記憶體訪問衝突問題(非法記憶體訪問)

2022-09-18 20:20:19 字數 1103 閱讀 3763

無獨有偶,我居然又碰上了同樣的問題。

原因跟之前一樣,物件在記憶體中已經被銷毀,或者這個物件壓根就沒有被建立過。

慢慢的查詢p_screen在**被複製以及在**被銷毀,最有效的方法就是看函式呼叫棧。

當我把斷點設定在p_screen賦值語句的那一行時,發現還沒執行到斷點處就已經觸發異常了,當然還有一種可能就是斷點處的函式根本就沒有被呼叫,而是跳過了這個函式而繼續往後面執行了,不過我反覆測試了一下,基本可以排除第二種可能。

因此問題的癥結就在指標在還沒有被初始化或者賦值之前就被訪問了(看到這個錯誤讀者是否很無語?那就繼續往下看吧    )

解決方法:

將指標的初始化提前到在訪問之前就行。  

總結:這個問題確實是很簡單,但是我為什麼會犯這種錯誤呢?

我覺得。。。這不怪我,不怪我,真的不怪我!!!

責任在於框架程式的響應方式(~。-) :

因為我的專案用的是mfc的框架程式設計,所以框架內部的各個模組呼叫先後順序真的並不是很明確,而且不是顯示(與隱式相對)的通過乙個成員函式呼叫另乙個成員函式,各個函式之間沒有明確的呼叫與被呼叫關係。

他們之間是基於訊息機制驅動的。

系統(核心)傳送訊息(這些訊息大部分是我的專案為了建立視窗或者申請資源的需要而自動要求核心傳送的,只有一小部分是核心捕捉到的訊息,比如滑鼠點選、鍵盤按下等等),指定函式對其進行響應,因此函式之間的呼叫關係以及執行的先後順序自然是捉摸不定的。

像這種基於系統訊息驅動的程式,在程式設計時一定要小心了,在訊息函式的呼叫順序不明確的時候,盡量不要把自己的賦值語句寫進去,除非萬不得已,為了實現功能的需要。

否則就有可能出現你的變數還沒有被初始化之前就已經被訪問,那麼就會出現程式執行時錯誤了。(慎用框架)

當然框架也有很多優點,對於我們這種剛剛寫專案的newbie,對設計模式也不太了解,框架可以幫我們構造好專案的乙個基本模型,我們只需要了解整個框架的結構,向裡面新增一些功能就好,這樣整個專案也就條理清晰,可讀性也強,也易於維護。

記憶體訪問越界問題

1.原理分析 經常有些新c 程式設計師問 c 的類的成員個數是不是有限制,為什麼我加乙個變數後程式就死了?或者說 是不是成員變數的順序很重要,為什麼我兩個成員變數順序換一換程式就不行了?凡此種種之怪現象,往往都是記憶體訪問越界所致。何謂記憶體訪問越界,簡單的說,你向系統申請了一塊記憶體,在使用這塊記...

多執行緒程式處理記憶體洩漏和訪問衝突問題

多執行緒程式開發與單執行緒開發相比,需要考慮的問題更多,難度更大,稍不留神就容易出現記憶體洩漏,要不就是訪問衝突。記憶體洩漏,還可以使用記憶體洩漏檢測工具進行檢測,使用visual leak detector是不錯的選擇,方便易用,網上有很多例子說明用法,說法基本一致。訪問衝突,對於多執行緒程式,在...

記憶體訪問越界

1.記憶體越界分配的原理 何謂記憶體訪問越界,簡單的說,你向系統申請了一塊記憶體,在使用這塊記憶體的時候,超出了你申請的範圍。例如,你明明申請的是100位元組的空間,但是你由於某種原因寫入了120位元組,這就是記憶體訪問越界。記憶體訪問越界的後果是 你的寫入破壞了本不屬於你的空間。如下所示的 輸出 ...