在用vs写程序,遇到了一些问题,_BLOCK_TYPE_IS_VALID(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就释放了一个已经被释放的内存,则会出现错误。
如有错误,请指正。
本文深入探讨了在使用C++编写程序时遇到的DebugAssertionFailed错误,详细解释了其产生的原因,包括内存泄漏导致的析构函数调用失败,以及内存释放时头部信息被非法修改的问题。通过实例分析,展示了如何避免此类错误,特别是针对堆内存的正确使用和释放策略。
1706





