zoukankan      html  css  js  c++  java
  • VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩溃原因及解决方法

    今天下午对面的老大调试遇到这个问题,大家一起讨论好久才解决这个问题

    crt源代码都是可以看到的,为了了解清楚原因,十分有必要查看源码,源码一般在你的VS安装路径下VCcrtsrc下。

    点击重试,定位到崩溃源码地方dbgdel.c的第52行。

    为了了解原因,我的测试代码是这样写的:

    int _tmain(int argc, _TCHAR* argv[])  
    {  
      
        char* p = "123456789";  
        delete p;  
        p = NULL;  
    }  

    _BLOCK_TYPE_IS_VALID宏用来检测这个内存块在当前堆上是否有效,但是这里的指针是一个临时变量,临时变量是在栈上分配的,函数清理栈时会自动回收这些内存,程序员无需管理。

    程序员new 和 malloc申请的内存是位于堆上面,程序不会自动清理,这就是区别所在。

    因此,检查你所释放(delete 或 free)的那个指针,不是动态申请的就别画蛇添足去释放了。

    老大遇到的情况就有点莫名其妙了,new了一段内存,然后调用delete[]释放,啥都没干也会崩溃。大家分析了下,代码本身是没有原因的,这时候他检查工程属性发现:大部分工程都是win32的,这个dll却是使用的mfc dll(说道MFC我想说下,这都什么年头了,如果是刚入行的就不要学MFC了,没意义没前途)。工程属性改正后,重新编译就好了。

  • 相关阅读:
    前端网站汇总
    更换Sublime Text主题字体
    免费收录网站搜索引擎登录口
    IE6,7,8支持css圆角
    CSS继承—深入剖析
    JavaScript正则表达式大全
    CSS伪元素选择器
    line-height用法总结
    判断腾讯QQ是否在线
    text-overflow使用文字超多div的宽度或超过在table中<td>
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/7618380.html
Copyright © 2011-2022 走看看