码迷,mamicode.com
首页 > 其他好文 > 详细

VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩溃原因及解决方法

时间:2017-10-02 09:30:59      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:路径   使用   没有   分享   int   tchar   入行   let   log   

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

技术分享

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

点击重试,定位到崩溃源码地方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了,没意义没前途)。工程属性改正后,重新编译就好了。

VS调试_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));崩溃原因及解决方法

标签:路径   使用   没有   分享   int   tchar   入行   let   log   

原文地址:http://www.cnblogs.com/rainbow70626/p/7618380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!