程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 關於C++的一個棧空間被占用問題的總結

關於C++的一個棧空間被占用問題的總結

編輯: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時,一定要注意長度的精確掌控

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved