最近專案里用了完成埠實作服務端TCP通訊,搜了網上的的代碼,發現使用時記憶體提交大小一直在增加:
我開了一個客戶端,連接后一直在發簡單的字串,服務端只接收,也沒做其他處理,科室發現記憶體一直在漲,是不是IOCP模型有問題,比較吃記憶體呀,因為反復看了例程代碼,沒發現記憶體泄漏的地方,VS除錯結束也沒有提示memory leak,納悶中,有高手指點下的嗎,可以留下qq,我把代碼發過去,幫我看看,
uj5u.com熱心網友回復:
密切關注new malloc 申請的記憶體,最后有沒有釋放uj5u.com熱心網友回復:
你自己記憶體沒有管理好,無用的記憶體沒有及時釋放,IOCP其實不需要使用多少記憶體的。
uj5u.com熱心網友回復:
記憶體泄漏和iocp機制沒有啥關聯雖然之前自己也懷疑過
事實證明凡是記憶體泄漏都是有原因的
uj5u.com熱心網友回復:
IOCP投遞send或recv請求時,需要傳入OVERLAPPED結構,這個結構一般是這么生成的:LPOVERLAPPED_SOCKET_RECV lpPerIOData = NULL;
lpPerIOData = (LPOVERLAPPED_SOCKET_RECV)HeapAlloc(
GetProcessHeap(),
HEAP_ZERO_MEMORY,
sizeof(OVERLAPPED_SOCKET_RECV));
你看看這個結構你釋放了沒有。完成例程里如果發生錯誤(DWORD dwError),比如傳輸的資料長度為0(DWORD cbTransferred),也需要釋放掉:HeapFree(GetProcessHeap(), 0, lpPerIOData);
uj5u.com熱心網友回復:
主要就是樓上說的那樣,在接收時的緩沖區那里,或者你搞一個全域緩沖區,每次都用那個,看還會不會記憶體增長。uj5u.com熱心網友回復:
謝謝大家回復我,問題還在解決中,我是參考的之前CSDN一個博主的原始碼(piggyxp https://blog.csdn.net/piggyxp/article/details/6922277),我改編完了,實測時發現記憶體增加的很快,最后整個軟體崩潰。然后我就用他的原始碼,就簡單的用網路助手建立一個連接,發一段字串,發現記憶體也增加,而且一次就是4k基本上,只連接但不發資料就不會。他的代碼,我反復看了接收的時候用的都是IOCP架構本身單句柄或單IO結構中申請的記憶體,而且也沒有重復申請(因為就建立一個連接,且一直保持)。我甚至全域搜索了new的地方,最后還是沒找到!不知道幾位高手方便提供下qq嗎,想跟你們詳細交流下。
uj5u.com熱心網友回復:
大家提供的 建議我先試試!轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/59542.html
標籤:網絡編程
