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

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

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

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

为了了解缘由,我的测试代码是这样写的:

int _tmain(int argc, _TCHAR* argv[])
{

char* p = "123456789";
delete p;
p = NULL;
}

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

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

因此,检查你所释放(delete 或 free)的那个指针,不是动态申请的就别弄巧成拙去释放了。

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

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

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

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡