_BLOCK_TYPE_IS_VALID(pHead->nBlockUse問題解析

pamxy發表於2013-04-28

轉自:http://blog.sina.com.cn/s/blog_5a6f39cf01014q9i.html

      在用D3DX寫程式,遇到了一些問題,_BLOCK_TYPE_IS_VALID(pHead->nBlockUse是其中的一個,後來在網上查了一下,得到相關資訊,特記錄一下,以備檢視。

      問題產生原因:

      1.記憶體洩漏;所以當程式退出時,系統會收回分配的記憶體,於是調解構函式,由於記憶體已被錯誤地釋放,於是就會出現“Debug Assertion Failed”的錯誤。

      2.這個assert說明什麼問題呢?說明有一塊記憶體在被釋放的時候,它的頭部裡面的資訊已經被改掉了,和預期的不一樣。記憶體分配的程式往往在被分配出的記憶體塊頭部放上一些校驗資訊。這個資訊記憶體的使用者是不知道也不應該修改的。這樣,在記憶體被釋放的時候,記憶體分配程式就可以驗對這個頭部資訊是否被改過了。若被改過,就說明發生了記憶體corruption. 

     這種corruption有兩種可能性:

     1)有人在記憶體越界寫東西;

     2)這塊記憶體已經被釋放了,又被重複釋放了一次。(在第一次被釋放中,是記憶體分配程式改掉了頭部資訊)。

     3.pHead_>nBlockUse就可能是空指標,或它指向的東西已經不存在了。 

     解決辦法:

     一般來說,這個問題產生的原因大部分是第二種情況,而corruption也最可能是第二種情況,即重複釋放記憶體。對於D3DX程式來說,如果是用的D3DX的API介面建立的指標,則在Release之後不需要也不能再呼叫delete來釋放記憶體,因為Release本來就已經釋放了記憶體,再次呼叫delete就會造成重複釋放記憶體,也就是本文所描述的那個問題。那麼對應的解決辦法就是刪掉Release後面所對應的delete語句就OK了。(注意,D3DX的API建立的指標只需要Release就OK,如果是自己建立的新的class,那麼最好加上delete語句來釋放記憶體。)


相關文章