报错内容:
导致这个问题的原因可能有很多,在我学习的项目中每次点击一个特定的位置都会突然程序崩溃,有时还会报错E:\xxx\SogouInput\Components\。
经过debug,我发现每次在释放一个变量的时候都会报一个错:
HEAP[TcpClient.exe]:
Heap block at 000001DD2F84E650 modified at 000001DD2F84E6AC past requested size of 4c
HEAP[TcpClient.exe]:
Invalid address specified to RtlFreeHeap( 000001DD26BB0000, 000001DD2F84E660 )
分析原因:
我找到了两个相关的帖子,上面介绍了这个问题可能出现的原因,贴在这里:c - 如何修复GDB的错误 "Invalid address specified to RtlFreeHeap" - IT工具网 与C++ free指针时的异常_heap[plasma-furnace.exe]: heap block at modified a-CSDN博客
经过分析,可能是因为我在释放上面这个pdu变量的时候出现问题,根据贴在上面的文章所说可以分析出:在分配空间时不会因为内存分配空间不够出现异常,而是在free时出现异常,同时是我的pdu在定义分配的时候分配的空间与赋值时赋给的内容大小不同,导致free的时候出现了问题。根据这个分析,往pdu定义的位置查看,果然,我pdu定义的数据大小为0,而需要读取一定的内容存在pdu的数据变量中。导致了大小不匹配,造成了溢出。
(此部分错误代码:mkPDU()中的参数表示留出存储数据的大小,按理这个值应该与需求的大小一致,但是这里设定为0,导致了错误)
解决方法:
修改代码为:
而报错中的E:\xxx\SogouInput\Components\,看上去有个搜狗输入法的文件夹,其实和输入法没什么关系,更多的可能是变量空间地址的问题。看来碰到了这种不好解释的问题还是得老老实实Debug。