_BLOCK_TYPE_IS_VALID(phead->nBlockuse)错误

来源:互联网 发布:mac系统被删除了 编辑:程序博客网 时间:2024/05/20 04:14

原文地址:http://blog.sina.com.cn/s/blog_5a6f39cf01014q9i.html

在用D3DX写程序,遇到了一些问题,_BLOCK_TYPE_IS_VALID(pHead->nBlockUse是其中的一个,后来在网上查了一下,得到相关信息,特记录一下,以备查看。

     问题产生原因:

     1.内存泄漏;所以当程序退出时,系统会收回分配的内存,于是调析构函数,由于内存已被错误地释放,于是就会出现“DebugAssertion 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语句来释放内存。)

0 0
原创粉丝点击