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

时间:2014-04-26 23:46:48   收藏:0   阅读:688
一、事情起因

一条线程调用了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

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

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!