指针二次释放(_BLOCK_TYPE_IS_VALID)

【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.

顺序  选择  循环  总结

时间: 2024-10-11 00:18:47

指针二次释放(_BLOCK_TYPE_IS_VALID)的相关文章

C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 本文由 arthinking 发表于315 天前 ⁄ itzhai.com原创文章 ⁄ C语言 ⁄ 评论数 3 ⁄ 被围观 1,775 views+ 指针数组: 在一个数组中,如果它的元素全部都是指针类

解释清楚智能指针二【用自己的话,解释清楚】

写在前面 用自己的话分析清楚~ 智能指针是如何使用的? 强指针是如何实现? 弱指针如何转化为强指针? 智能指针的使用 智能指针的使用必须满足如下条件: 这个类需要继承自RefBase 为什么需要虚析构函数? 虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象.虚函数的出现是为了解决多态问题. 满足上述条件的类就可以定义智能指针了,普通的指针使用如下方式: MyClass *p_obj; 智能指针是这样定义: Sp<MyClass> p_obj; 强指针的

int?(*p)[4]?p?是二级指针?二维数组?二级指针?.xml

pre{ line-height:1; color:#2f88e4; background-color:#e9ffff; font-size:16px;}.sysFunc{color:#3d7477;font-style:italic;font-weight:bold;} .selfFuc{color:#a0b684;} .bool{color:#86ddd8;} .condition{color:#94e269;font-weight:bold;} .key{color:#ae0bfd;} .

关于数组以为指针二维指针的应用举例

事实上,计算机系统的多维数组其实最终还是以一维数组的形式实现的.就N x M的二维数组来讲,设其数组名为array.指针array指向一个数组,该数组存放的是一系列指针,这些指针分别指向相应的一维数组,而这些数组中存放的才是我们的数据. 由此array 是第i个指针变量地址,array[j]则表示相对于第i个指针变量偏移j*sizeof(数组类型).系统通过这种机制访问了该二维数组的第i行,第j列的内容.有上述可知,指向二维数组的指针其实是指向“指针变量地址”的指针变量.所以在声明指向二维数组的

浅谈C中的数组和指针(二)

原文转载地址:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 在原文基础上增加自己的理解作为修改 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组的一些区别,然而在某些情况下,指针和数组是等同的,下面讨论一下什么时候指针和数组是相同的. C语言标准对此作了说明: 规则1:表达式中的数组名被编译器当做一个指向该数组第一个元素的指针: 注:下面几种情况例外 1)数组名作为sizeof的操作数 2)使用&

指针二三事

一.指针:用来保存地址的"变量"叫做指针,可以理解成指针是地址的一个别名. 例:定义一个整形指针 "指针的内容","指针所指向的内容","指针变量的地址": 指针的内容:指针变量p里面存放的是a的地址,也就是0x0018ff44. 指针所指向的内容:指针变量p里面存放的地址(0x18ff44)这块空间所对应的值,也就是10,我们通过*p(解引用)可以访问到这个值.即:*p作为右值时,*p==10,当*p作为左值时代表的就是a这

[C/C++]_[中级]_[使用智能指针的方式释放malloc出来的堆空间]

场景: 1. 使用auto_ptr 的方式可以wrap类对象,  之后在方法结束后可以自动释放对象, 参考:这样在有条件判断的语句时可以省掉free语句或CloseHandle. http://blog.csdn.net/infoworld/article/details/9008911 2.C++的特性之一就是类对象(非返回值的对象)在方法结束后会自动调用析构函数,这样在析构函数里可以放一些释放资源的操作. 3. 这里实现了一个类似auto_ptr的类的实用Wrap类,可以参考根据自己需要自定

VC++自释放指针、自释放虚拟内存、自关闭句柄、局部作用域回调函数调用等辅助开发类

#pragma once #ifndef NULL #define NULL 0 #endif namespace RangeHelper { template <class T> class CAutoDeletePtr { //自动删除指针 public: CAutoDeletePtr() : m_ptr(NULL) { } CAutoDeletePtr(T* ptr) { m_ptr = ptr; } ~CAutoDeletePtr() { Free(); } void Free() {

C++指针二(易错模型)

规则一:Main(主调函数)分配的内存(在堆区,栈区.全局区)都可以在被调用函数里使用.如果在被调用函数里面的临时区(栈)分配内存,主调用函数是不能使用的. #include "stdio.h" #include "stdlib.h" #include "string.h" char * getstring1() { char *p1 = "abcde"; return p1; } char * getstring2() {