_BLOCK_TYPE_IS_VALID(pHead->nBlockUse问题解析

来源:互联网 发布:淘宝买港版苹果手机 编辑:程序博客网 时间:2024/05/30 05:41

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

问题产生原因:

1.内存泄漏;所以当程序退出时,系统会收回分配的内存,于是调析构函数,由于内存已被错误地释放,于是就会出现“Debug Assertion Failed”的错误。

2.这个assert说明什么问题呢?说明有一块内存在被释放的时候,它的头部里面的信息已经被改掉了,和预期的不一样。内存分配的程序往往在被分配出的内存块头部放上一些校验信息。这个信息内存的用户是不知道也不应该修改的。这样,在内存被释放的时候,内存分配程序就可以验对这个头部信息是否被改过了。若被改过,就说明发生了内存corruption.

这种corruption有两种可能性:

1)有人在内存越界写东西;

2)这块内存已经被释放了,又被重复释放了一次。(在第一次被释放中,是内存分配程序改掉了头部信息)。

3.pHead_>nBlockUse就可能是空指针,或它指向的东西已经不存在了。 


例如以下程序可能导致这个错误:

#include<iostream>using namespace std;int main(){int j=3;int *a=new int;cout<<a<<": "<<*a<<endl;cout<<&j<<": "<<j<<endl;a=&j;cout<<a<<": "<<*a<<endl;cout<<&j<<": "<<j<<endl;//delete a;system("pause");return 0;}

运行结果:



但是上面程序存在一个问题,就是a是一个堆内存,但是没有释放,即delete a,当我去掉注释的delete a;时,却出现了


没错,就是这个错误,那么问题出在那里呢?

其实,在给指针a复制时,a=&j;而对于局部变量j来说,是存储在桟内存中的,所以这个指针a也指向了桟内存中存放的值的地址,那么存取这个值都是没有错的,最关键的,就是释放,因为桟内存是程序结束后自动释放的,而堆内存需要显式释放,如果在程序结束后,j变量对应的值已经不存在了,那么此时的delete就释放了一个已经被释放的内存,则会出现错误。


如有错误,请指正。

0 0
原创粉丝点击