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

一、事情起因

一条线程调用了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++的一个栈空间被占用问题的总结

上一篇:Java参数传递


下一篇:基于配置文件的工厂设计模式实现,并且做到对象的单例,类似于spring的ioc