指针二次释放(_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.
顺序 选择 循环 总结