博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针二次释放(_BLOCK_TYPE_IS_VALID)
阅读量:6934 次
发布时间:2019-06-27

本文共 647 字,大约阅读时间需要 2 分钟。

【1】_BLOCK_TYPE_IS_VALID是什么错误?

(1)最简单的示例代码如下:

1 void main()2 {3     int* pA = new int(1);4     delete pA;5     delete pA;6 }

(2)运行后崩溃截图如下:

(3)分析结果:

这个assert说明什么问题呢?

说明有一块申请的内存在被释放的时候,它的“头部”里面的信息已经被改掉了,和预期的不一样。

内存分配的程序往往在被分配出的内存块“头部”放上一些校验信息。

当然,这个信息使用内存的用户是不知道也不应该修改的。

这样,在内存被释放的时候,内存分配程序就可以验对这个“头部”信息是否被改过。

若被改过,就说明发生了内存变异(memory corruption)。 这种corruption有两种可能性:

<1> 有人在内存越界写东西。

<2> 这块内存已经被释放掉。

不论哪种情况,当内存再进行释放时候会导致断言失败。

pHead_>nBlockUse指向的东西已经不存在了。 

_BLOCK_TYPE_IS_VALID  块类型是否有效的宏

(4)使用过程举例:

最常见的一种写法:自定义一个类,类内部使用了指针成员变量,而指针成员变量在某个成员函数中被释放过 。

但是,释放后没有置空(pTemp = NULL),导致析构函数中再进行释放时候直接崩溃。

 

其实,简单的演示崩溃本质正如上所述。

 

Good  Good  Study, Day Day Up.

顺序  选择  循环  总结

转载地址:http://cigjl.baihongyu.com/

你可能感兴趣的文章
移动端手势库Hammer.js学习
查看>>
Atitit main函数的ast分析 数组参数调用的ast astview解析
查看>>
设计模式学习笔记(八:迭代器模式)
查看>>
软件测试体系划分与职业素养
查看>>
C++ primer学习方法
查看>>
关于运维体系谈谈我的想法
查看>>
系统访问慢的几个原因
查看>>
mac git安装及github配置
查看>>
BZOJ2498 : Xavier is Learning to Count
查看>>
postgresql数据库的数据导出
查看>>
Kafka: Connect
查看>>
hibernate(七) hibernate中查询方式详解
查看>>
用gulp构建你的前端项目
查看>>
cmd for 循环拷贝文件
查看>>
【转】PHP date("Y-m-d H:i:s");获取当前时间 差8小时解决办法
查看>>
System.Security.Cryptography.CryptographicException,密钥集不存在
查看>>
敏捷团队中的QA由来
查看>>
gdb调试报错:Missing separate debuginfos, use: debuginfo-install glibc-XXX
查看>>
根据百度API获得经纬度,然后根据经纬度在获得城市信息
查看>>
mariadb 10.1查看per connection内存消耗
查看>>