zoukankan      html  css  js  c++  java
  • 指针二次释放(_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.

    顺序  选择  循环  总结

  • 相关阅读:
    PHP $_SERVER 变量
    $_SERVER变量 以及 PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
    Funs
    搞定,务必记得要以最简便的整合资源来做
    还是要好好研究开源的php
    重回编程
    登录弹窗代码(居中)
    测试工具了解指南
    工作总结1
    HTML5 contextmenu隐藏鼠标右键菜单
  • 原文地址:https://www.cnblogs.com/Braveliu/p/4185293.html
Copyright © 2011-2022 走看看