VS調試_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩潰原因及解決方法
阿新 • • 發佈:2017-10-02
說道 動態 意義 討論 清理 問題 [] all 測試
今天下午對面的老大調試遇到這個問題,大家一起討論好久才解決這個問題
crt源代碼都是可以看到的,為了了解清楚原因,十分有必要查看源碼,源碼一般在你的VS安裝路徑下VC\crt\src下。
點擊重試,定位到崩潰源碼地方dbgdel.c的第52行。
為了了解原因,我的測試代碼是這樣寫的:
int _tmain(int argc, _TCHAR* argv[]) { char* p = "123456789"; delete p; p = NULL; }
_BLOCK_TYPE_IS_VALID宏用來檢測這個內存塊在當前堆上是否有效,但是這裏的指針是一個臨時變量,臨時變量是在棧上分配的,函數清理棧時會自動回收這些內存,程序員無需管理。
程序員new 和 malloc申請的內存是位於堆上面,程序不會自動清理,這就是區別所在。
因此,檢查你所釋放(delete 或 free)的那個指針,不是動態申請的就別畫蛇添足去釋放了。
老大遇到的情況就有點莫名其妙了,new了一段內存,然後調用delete[]釋放,啥都沒幹也會崩潰。大家分析了下,代碼本身是沒有原因的,這時候他檢查工程屬性發現:大部分工程都是win32的,這個dll卻是使用的mfc dll(說道MFC我想說下,這都什麽年頭了,如果是剛入行的就不要學MFC了,沒意義沒前途)。工程屬性改正後,重新編譯就好了。
VS調試_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩潰原因及解決方法