cURL
Haxx ad
libcurl

Shopping cart software, Online file storage, Online photo storage, Hosted shopping cart, Contact management software, Email marketing software, Project management software, Issue tracking software, Online notepad, Web publishing software

curl's project page on SourceForge.net

Sponsors:
Haxx

cURL > Mailing List > Monthly Index > Single Mail

curl-library Archives

RE: What is the proper way to get libcurl to free it resources when used within a C++ Class?

From: Dantzler, DeWayne C <dewayne.c.dantzler_at_boeing.com>
Date: Tue, 24 Nov 2009 11:47:30 -0800

On Tuesday 24 of November 2009 19:53:04 Dantzler, DeWayne C wrote:
> That is exactly what I did. I placed the calls for curl_global_init()
> and
> curl_easy_init() in this order in a constructor and place the calls
> for
> curl_global_cleanup() and curl_easy_cleanup() in the destructor. In
> fact, I tried several different combinations in the destructor for the
> curl_global_cleanup()and curl_easy_cleanup() methods, but each
> combination had memory resource issues(see below). Now, I do call a
> 3rd party
> library(Xerces) that also uses the curl library.

On Tuesday 24 of November 2009 Kamil Dudka wrote:
>> You are doing something a bit different. It's not good idea to call
>>curl_global_init()/curl_global_cleanup() more than once for nothing. I know there is something like a reference
>>counter, but do not use it unless you really need to. Basically it's not thread-safe and it can trigger a memory leak >>under certain circumstances.

>> If you want to get more help from us, you'll need to write something like a minimal example we can compile and run.
>> Then it's easy for us to tell you what's actually wrong in your code.

==============================================================

I'm not calling curl_global_init()/curl_global_cleanup() more than once. I'm calling them only once. Xerces is a 3rd party library and I have no access to the source or know how they are using curl in the their library. This is a large C++ application and I'm using curl in only one class. In my ctor, I call curl_global_init() first then make a call to curl_easy_init(). According to the curl documentation, if you call curl_global_init(), you should call curl_global_cleanup(). Likewise it says if you call curl_easy_init(), then you should call curl_easy_cleanup(), but when I do this the application crashes with a SIGSEGV, Segmentation fault.

The call stack shows:
Results:Program received signal SIGSEGV, Segmentation fault.
=================================================
#0 0x63912920 in Curl_cookie_loadfiles+0x9c ()
#1 0x63933c74 in flush_cookies+0x8c ()
#2 0x639341ac in Curl_close+0x2ac
#3 0x639624e8 in curl_easy_cleanup+0x3c ()

If I only call curl_global_cleanup() in the dtor, the application does not crash, but it leaks memory as reported by PurifyPlus.
Results:Memory Leak.
=================================================
      Memory leaked: 37013 bytes (60.9%); potentially leaked: 0 bytes (0%)
         MLK: 34256 bytes leaked at 0x401c49d0
         This memory was allocated from:
               malloc [rtlib.o]
               calloc [rtlib.o]
               Curl_open [libcurl.sl.5.1]
               curl_easy_init [libcurl.sl.5.1]
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette: http://curl.haxx.se/mail/etiquette.html
Received on 2009-11-24

These mail archives are generated by hypermail.

donate! Page updated November 16, 2009.
web site info

File upload with ASP.NET