在用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语句来释放内存。
注释:
1、本人遇到的也是第二种情况:
struct *pstr =new struct; //struct是一个结构体类型
char *pstr->pSubStr=new char[5];
delete []pstr->pSubStr;//pstr和pSubStr两者皆是指针。
delete []pstr;
执行到第四步时提示上述错误的。
解决办法:
如下方式不行
char* pTemp=pstr->pSubStr;
delete pstr;
delete pTemp;
原因是delete []pstr;语句里带有[],解决办法是改为deletepstr;即可。
2、内存corruption(腐败),可以理解为内存数据的损坏或是内存数据的过时(如该内存数据被释放过后)。
参见:
block_type_is_valid 百度
corruption 计算机 百度
What is data corruption?什么是数据腐败《转》
http://blog.chinaunix.net/uid-26126915-id-2942349.html