_BLOCK_TYPE_IS_VALID(pHead->nBlockUse问题解析

在用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就释放了一个已经被释放的内存,则会出现错误。


如有错误,请指正。

  • 15
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值