解決libcurl記憶體洩露的問題

2021-09-23 20:31:31 字數 2786 閱讀 3347

情景是乙個程式一直執行post,通過http協議上傳資料。

先curl_easy_init();

之後再curl_easy_perform(curl);

最後 curl_easy_cleanup(curl); 

但是這種方法是存在記憶體洩露的。參見

示例:

#include #include "curl/curl.h"

int main(void)

return 0;

}

但是考慮到如果使用http長連線的話,可能會效率更高,因此,在執行上傳部分新增了時間判斷邏輯,如果超過1分鐘就執行curl_global_cleanup(),然後重新新建乙個curl物件,否則就使用原來的curl物件。

經過測試,執行curl_global_cleanup()後是沒有記憶體洩露的。

#include #define curl_staticlib //靜態鏈結

if ( false )//用於除錯的設定

curl_easy_setopt(curl, curlopt_url, strurl.c_str());

curl_easy_setopt(curl, curlopt_post, 1);//設定為非0表示本次操作為post

curl_easy_setopt(curl, curlopt_postfields, strpost.c_str());

curl_easy_setopt(curl, curlopt_readfunction, null);

curl_easy_setopt(curl, curlopt_writefunction, onwritedata);

curl_easy_setopt(curl, curlopt_writedata, (void *)&strresponse);

curl_easy_setopt(curl, curlopt_nosignal, 1);

curl_easy_setopt(curl, curlopt_connecttimeout_ms, 3000);

curl_easy_setopt(curl, curlopt_timeout, 300);

curl_easy_setopt(curl, curlopt_followlocation, 1); //支援伺服器跳轉

curl_slist_free_all(headers);//清理headers,防止記憶體洩漏

//curl_easy_cleanup(curl);

return res;

}static int ondebug(curl *, curl_infotype itype, char * pdata, size_t size, void *)//curl除錯

deepcopy引起的LUA記憶體洩露的問題

網路遊戲專案中,lua引起的記憶體洩露的一次事故。在用lua的時候,某種情況下,很多同學都喜歡把物件拿來深度拷貝,雖然我是不太喜歡這麼幹,但專案組開發的同學比較多,也難免別人不會這麼幹。當乙個table裡存在交叉引用的時候,用deepcopy就會出現嚴重的記憶體洩露,實際證明,deepcopy並不會...

解決使用 libcurl 遇到的多執行緒崩潰問題

使用 curl 訪問 http 鏈結時,用 easy handle,阻塞方式訪問時發現會每個訪問啟動乙個執行緒去進行dns 想減少這種消耗,故此採用了 sh curl share init curl share setopt sh,curlshopt share,curl lock data dns...

c 記憶體洩露(三) 定位和解決記憶體洩露

如果編寫的c 程式出現記憶體洩露了,不要慌忙,你要相信任何錯誤都是人為造成的,只要是人為的,你一定能找到錯誤所在,只不過是時間的問題而已。在面對記憶體洩露,如果程式不是特別長的話,你可以使用人工校驗,著重檢視new和delete的匹配呼叫。如果經過一番折騰還未確定程式的錯誤所在,首先應該明白程式在不...