_BLOCK_TYPE_IS_VALID(pHead-nBlockUse问题解析

news/2024/5/20 8:17:48 标签: , 内存分配, 内存泄漏, 指针

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


如有错误,请指正。


http://www.niftyadmin.cn/n/1774086.html

相关文章

控件渐变色的实现

控件渐变色的实现&#xff08;一&#xff09;—— CAGradientLayer实现控件渐变色的实现&#xff08;二&#xff09;—— Core Graphics实现

C++中new、delete 与new[]、delete[]

在C中&#xff0c;申请堆内存&#xff0c;使用new或者new[],在回收用 new 分配的单个对象的内存空间的时候用 delete&#xff0c;回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和 delete[]&#xff0c;其中又分为两种情况&#xff1a;(1) 为基本数据类…

JavaWeb-HTTPServletReauest和HTTPServletResponse

2019独角兽企业重金招聘Python工程师标准>>> HttpServletRequest 和 HttpServletResponse Servlet配置方式 1. 全路径匹配以 / 开始 /a /aa/bb localhost:8080/项目名称/aa/bb 2. 路径匹配 , 前半段匹配以 / 开始 &#xff0c; 但是以 * 结束 /a/* /* 其实是一个通配…

flutter版本的玩Android客户端

flutter学习案例 目录介绍 00.项目下载与查看01.项目介绍02.项目优势03.部分功能介绍04.部分截图展示05.版本更新06.flutter系列博客07.感谢08.如何辨别flutter与原生09.关于更多00.项目下载与查看 0.0 项目地址 https://github.com/yangchong2...0.1 下载apk 已经打包好的apk存…

何时需要强制类型转换?

可能运行程序时&#xff0c;大家或多或少出现过编译器报这样的警告&#xff1a; #include<iostream>using namespace std;int main() {int i3;double j3.99;i*j;cout<<i<<endl;//11system("pause");return 0; }warning C4244: “*”: 从“double”…

OneNote发布至博客园

第一步&#xff1a;开启入口 文件--》发送--》发送至博客 在弹出的word文件的对话框中&#xff0c;选择立即注册 第二步&#xff1a;配置上送至博客园的流程 &#xff08;承接上一步&#xff09;在博客的引擎中&#xff1a;选择其他 设置连接账户的用户名密码&#xff0c;连接地…

C++标准库---容器作为形参?

通常&#xff0c;函数不应该有 vector 或其他标准库容器类型的形参。调用含有普通的非引用 vector 形参的函数将会复制 vector 的每一个元素。因此&#xff0c;调用含有普通的非引用vector作为形参的函数&#xff0c;无论效率还是资源利用率&#xff0c;都是极大的浪费。 从避…

【Java菜鸟学习总结】Java基础(关键字、数据类型、运算符、流程控制)

目录 【Java菜鸟学习总结】Java基础&#xff08;关键字、数据类型、运算符、流程控制&#xff09;1、关键字2、保留字3、标识符4、数据类型5、运算符6、程序流程控制【Java菜鸟学习总结】Java基础&#xff08;关键字、数据类型、运算符、流程控制&#xff09; 1、关键字 1.1、用…