关于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时,一定要注意长度的精确掌控
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值