首页 > 编程语言 > 详细

关于C++的一个栈空间被占用问题的总结

时间:2014-04-26 23:46:48      阅读:688      评论:0      收藏:0      [点我收藏+]
一、事情起因

一条线程调用了Map 的一个erase方法 结果dump了

二、原因假设

1、Map中的的数据被其他线程释放了,通过find验证了一下,不可能,数据还在,活生生的

2、Map中的数据被覆盖了或者被改写了   分析结果:看了一下数据,都没错,字节也都对齐

3、通过单步调试发现,在STL内部调用结尾释放指针是,所指的地址出现异常,正常情况应该是一个空指针,结果是有了一个莫名的值。怀疑这部分数据被篡改。

但是到底是哪里呢,。。。。。。。。。。。。。。。。。。一个漫长的注释,反注释调试的过程。终于在这个的一个地方 发现了问题的原因

三、问题场景

线程1 

memcpy(m_curProxyAddr.szUserPass, m_curProxyAddrInfoEntity->szUserPass, 50);

线程2

m_CallSyncMap.erase(pReq->lSyncID);

m_curProxyAddr.szUserPass 这个是一个 size=33的缓冲区,在这33的缓冲区 cpy了一个大小为50 的缓冲区,这样就会产生一个未知的行为,
而这个未知行为的表现就是导致线程2的erase出错。


四、教训

在做相关内存copy时,一定要注意长度的精确掌控

关于C++的一个栈空间被占用问题的总结,布布扣,bubuko.com

关于C++的一个栈空间被占用问题的总结

原文:http://blog.csdn.net/lenyusun/article/details/24555349

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!