_BLOCK_TYPE_IS_VALID(pHead->nBlockUse问题解析

来源:互联网 发布:淘宝快递助手怎么授权 编辑:程序博客网 时间:2024/05/29 21:28


在做相机校正的界面的时候,最后总是出现这个问题,后来,在想放弃的时候,发现了问题的所在,即:内存泄露。后来偶然的修改:将所有的delete语句注释掉,因为已经有了Release。运行成功,没有问题。就是下面这篇帮助了我,纪念一下。顺便提一下,提前一天完成了老板交代的任务,小兴奋。

转载
标签:

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语句来释放内存。)

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕后期尿酮体高怎么办 糖尿病尿酮体3是怎么办 孕39加6没反应怎么办 孕33周感冒咳嗽怎么办 孕33周感冒鼻塞怎么办 孕29周感冒了怎么办 孕35周感冒鼻塞怎么办 孕33周感冒头疼怎么办 胆囊炎和胆结石同时得了该怎么办 体检时来例假了怎么办 梦幻西游没蓝了怎么办 u盘文件删除不了怎么办 魔兽争霸3没路了怎么办 独立显卡玩lol卡怎么办 住6楼发生地震怎么办 地震来了住高层怎么办 拆了点剪力墙怎么办 地震后房子塌了怎么办 房子住70年以后怎么办 房子住满70年后怎么办 房子的年限过了怎么办 配重墙已经拆了怎么办 把配重墙拆了怎么办啊 睡在潮湿的环境怎么办 剪力墙开了门洞怎么办 承重墙开了横槽怎么办 剪力墙拆了一点怎么办 买的楼房70年后怎么办 老小区成危房了怎么办 地震来了怎么办教案ppt 地震来了怎么办手抄报 地震来了在家里怎么办 脸上有黑头毛孔又粗怎么办 17岁看起来显老怎么办 所有证件都丢了怎么办 护师成绩没打印怎么办 护士执业证丢了怎么办 护士证过期5年怎么办 护士证过期2年了怎么办 护士证过期3个月怎么办 护士证过期3年怎么办