內存訪問沖突問題(非法內存訪問)


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

 

原因跟之前一樣,對象在內存中已經被銷毀,或者這個對象壓根就沒有被創建過。

慢慢的查找p_Screen在哪里被復制以及在哪里被銷毀,最有效的方法就是看函數調用棧。

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

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

解決方法:

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

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

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

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

因為我的項目用的是MFC的框架編程,所以框架內部的各個模塊調用先后順序真的並不是很明確,而且不是顯示(與隱式相對)的通過一個成員函數調用另一個成員函數,各個函數之間沒有明確的調用與被調用關系。

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

系統(內核)發送消息(這些消息大部分是我的項目為了創建窗口或者申請資源的需要而自動要求內核發送的,只有一小部分是內核捕捉到的消息,比如鼠標點擊、鍵盤按下等等),指定函數對其進行響應,因此函數之間的調用關系以及執行的先后順序自然是捉摸不定的。

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

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

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM