情景是乙個程式一直執行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的匹配呼叫。如果經過一番折騰還未確定程式的錯誤所在,首先應該明白程式在不...