使用winsock spi在WSPSend函式中修改http請求頭時遇到問題,怎樣給lpBuffers重新賦值?

時間 2021-06-04 05:59:41

1樓:gmsj0001

題目有點老,題主提這個問題是由於當時是初學,對C/C++程式設計的記憶體管理還不熟悉。相信題主早已解決此問題,不過既然看到,還是來填個坑。

比起.NET,C/C++的最大靈活之處就是能夠靈活管理記憶體,所以必須約定好什麼時候由什麼人分配與釋放記憶體。個人並不建議初學者就去依賴洩漏檢查工具,記憶體管理約定是在C/C++設計初期就應該考慮的問題。

記憶體管理的一般約定是主張「誰分配誰釋放」,C庫函式(如malloc/free,new/delete)由於引用只對本模組有效的隱式宣告的堆而必須保證對上述函式的成對呼叫必須限制在本模組(dll)裡。如果設計是多模組的,必須要跨模組釋放,則操作記憶體必須直接呼叫由kernel32提供的HeapAlloc與HeapFree。

以該問題為例,windows申請的記憶體只能windows去釋放,你要寫的lsp模組申請的記憶體必須你自己釋放。所以當你嘗試delete windows的記憶體肯定會assert,而你自己分配的new header沒有釋放當然就洩漏了。

顯然在send的掛鉤裡你沒有機會釋放這段記憶體了。一般來想是應該放在呼叫上級的send後釋放,但這個嘗試你實驗失敗了,大概是由於非同步的原因。那麼標準的方案應該是記錄所有的非同步請求與你分配的buffer的對映,手動輪詢請求是否完成,將完成的請求用到的buffer釋放掉。

不建議使用lpCompletionRoutine與event,因為你這是鉤子函式,這些引數有可能是應用程式已經定好的,改起來不方便。

Windows下想使用Linux環境,WSL Docker VM應該怎麼選擇?

北海草魚 最近除錯課題組專案,因為需要使用C 需要配置太多環境,前後因為系統崩潰重灌了很多次,也沒進行備份,所以最近用了docker來完成。因為需要使用qt程式設計GUI介面,所以下了乙個image dorowu ubuntu desktop lxde vnc,這個只是基礎的帶GUI介面的ubunt...

使用apple pencil在ipad pro繪畫是否需要貼膜

嘿軒 用了兩年半快三年了,一直沒有貼膜,屬於重度使用者,沒事就用他畫草圖,平時用起來很隨意,現在磨損程度還行,只有幾個明顯的劃痕,相比螢幕我覺得後背放桌面上反而容易磨損,推薦背面貼個膜 dro 貼膜看個人需要。如果是平常寫字畫圖比較多的話,當然還是貼個膜好一點。我買的就是很普通的磨砂膜,20多塊錢五...

在VS code中 使用Jupyter notebook如何拆分cell?

jerry hao 這個問題的答案是這樣的 vscode從1.46版開始引進了一種叫Notebook的文件,主要是用來處理github的Issue,他看起來很像Jupyter Notebook,但後者目前是通過vscode python外掛程式來支援的。你說的那個拆分單元格是為Notebook文件用...