断言_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)问题解析

来源:互联网 发布:ubuntu eric pyqt5 编辑:程序博客网 时间:2024/06/11 16:24

_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)问题解析

 
标签: 

directx

 

杂谈

分类: DirectX

      在用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 =newstruct; //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

0 0