關於libcur接口l函數curl_easy_perform內存泄露的問題

地址: http://blog.csdn.net/hujkay
作者:Jekkay Hu([email protected])
關鍵詞:Windows,curl,ssl,  visual c++ 2005, libcurl, https, openssl, 內存泄露
時間: 2014/3/3


精靈族都是高富帥和白富美~~~~~

     

   1. 問題描述

    最近,編譯了最新版本V7.35靜態libcurl庫,含有靜態openssl 1.0.0f,所以支持HTTPS。在程序中運行也比較正常,能夠正常抓取HTTP和HTTPS的頁面。但程序運行時間一久,電腦就特別的卡,仔細研究發現小小程序幾乎把電腦的內存吃光了,顯然這是內存泄露的問題。

    爲了查出內存泄露的地方,我只好用VC2005打開工程,將內存泄露檢測庫VLD(Visual leak detection)編譯進去,用Debug(MTD編譯)模式調試。調試了一整天,檢測出內存泄露都發生在curl_easy_perform這個函數裏面,查看調用棧時,泄露的內存都是在openssl庫裏面,由於沒有openssl pdb調試符號,所以無法確定到底是其中的哪個函數出現問題的。

    我重新建了一個新的 MFC工程testlibcurl,然後調用libcurl抓取Web頁面一百次,奇怪的是這次居然沒有發生內存泄露,不管是抓取HTTP還是HTTPS頁面,curl_easy_perform函數這次都沒有內存泄露,好奇怪!仔細對比了一下這兩個工程的不同之處,才發現前者是多線程,後者是單線程。爲了驗證是否多線程的原因,我在testlibcurl工程中新建了一個線程,在線程中抓取HTTPS頁面,這次居然就出現了內存泄露!!!然後,我多測試了幾次,測試的結果有點讓人失望吧,現在總結使用含靜態openssl的libcurl庫問題如下。

   1. 在單線程中,訪問HTTP和HTTPS都不會發生內存泄露

   2. 在多線程中,訪問HTTP不會發生內存泄露

   3. 在多線程中,訪問HTTPS頁面,curl_easy_peform會發生內存泄露,從調用棧來看是內存泄露的地方是在openssl裏面。


   2. 我的解決方案

    放棄使用含有靜態的Openssl庫的libcurl,只能使用openssl的動態鏈接庫,纔不會發生內存泄露。

   

 

點此打發咖啡】[https://me.alipay.com/jekkay]

胡楊, Jekkay Hu

2014/3/3




發佈了52 篇原創文章 · 獲贊 16 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章