_BLOCK_TYPE_IS_VALID(pHead->nBlockUse問題解析
轉自: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語句來釋放記憶體。)
相關文章
- 誤操作:釋放棧上空間 Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)ExpressBloC
- golang url解析問題Golang
- svn上問題解析
- Oracle IO問題解析Oracle
- oracle IO 問題解析Oracle
- weex常見問題解析
- Oracle IO問題解析(ZT)Oracle
- Oracle IO問題解析(7)Oracle
- Oracle I/O問題解析Oracle
- Mybatis N+1問題解析MyBatis
- answerOpenCV輪廓類問題解析OpenCV
- 解析xml 成bool的問題XML
- iOS介面資料解析問題iOS
- JavaScript 的 this 指向問題深度解析JavaScript
- Android 解析度問題Android
- jdom解析中文編碼問題
- 域名解析常見問題(上)
- 域名解析常見問題(下)
- 解析SQL Server中行轉列問題SQLServer
- zt_Oracle IO問題解析系列Oracle
- 雲解析專家講解DNS解析生效時間問題DNS
- HandlerThread解析以及相關問題分析thread
- Linux無法解析主機問題Linux
- Go 原生外掛使用問題全解析Go
- 解析機器學習中的資料漂移問題機器學習
- nginx DNS 解析快取的更新問題NginxDNS快取
- 無法執行的update問題解析
- 字元編碼常識及問題解析字元
- 利用JAXP解析xml中遇到的問題XML
- Qxlsx庫解析xlsx檔案問題
- 域名解析需要多久生效?域名解析常見問題解答
- DNS解析常見問題:域名解析生效原理及時間DNS
- sra檔案下載及解析的問題
- golang 解析php輸出json相容問題GolangPHPJSON
- git相關問題解析,你想要的都有?Git
- 全面解析快取應用經典問題快取
- java 解析php序列化資料問題JavaPHP
- 光纜在施工中注意點問題解析