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

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: Mon, 23 Nov 2009 16:50:02 -0800

Hello

I'm using libcurl with C++ classes in a single threaded application by setting up the curl env in the constructor and invoking cleanup operation in the destructor, but I'm having trouble freeing the allocated memory. I read the curl documentation and tutorial. What is the correct method of freeing resources?

Making the following curl function calls In the constructor:
=======================================================
Ctor()
{
curl_global_init(CURL_GLOBAL_ALL);
_cURLHandle = curl_easy_init();
curl_easy_setopt(_cURLHandle, CURLOPT_ERRORBUFFER,_cURLMessages);
}

According to the curl documentation:
 curl_easy_init initializes curl and this call MUST have a corresponding call to curl_easy_cleanup(3)<http://curl.haxx.se/libcurl/c/curl_easy_cleanup.html> when the operation is complete.

According to the curl documentation:
You should call curl_global_cleanup(3)<http://curl.haxx.se/libcurl/c/curl_global_cleanup.html> once for each call you make to curl_global_init(3)<http://curl.haxx.se/libcurl/c/curl_global_init.html>, after you are done using libcurl.

I tried 4 scenarios for cleanup in the destructor

dtor scenario_1
{
        /*Call curl_global_cleanup() immediately before the program exits, when the program is again only one thread
         *and after its last use of libcurl. It isn't actually required that the functions be called at the beginning
         *and end of the program -- that's just usually the easiest way to do it. It is required that the functions
         *be called when no other thread in the program is running.
         */
        curl_global_cleanup();

        /*This function must be the last function to call for an easy session. It is the opposite of
         * the curl_easy_init(3) function and must be called with the same handle as input that the
         * curl_easy_init call returned.
         */
        curl_easy_cleanup(_cURLFileHandle);
}

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 ()

dtor scenario_2
{
        /*This function must be the last function to call for an easy session. It is the opposite of
         * the curl_easy_init(3) function and must be called with the same handle as input that the
         * curl_easy_init call returned.
         */
        curl_easy_cleanup(_cURLFileHandle);

        /*Call curl_global_cleanup() immediately before the program exits, when the program is again only one thread
         *and after its last use of libcurl. It isn't actually required that the functions be called at the beginning
         *and end of the program -- that's just usually the easiest way to do it. It is required that the functions
         *be called when no other thread in the program is running.
         */
        curl_global_cleanup();
}
Results:Program received signal SIGSEGV, Segmentation fault.
=================================================
#0 0x6388d920 in Curl_cookie_loadfiles+0x9c ()
#1 0x638aec74 in flush_cookies+0x8c
#2 0x638af1ac in Curl_close+0x2ac
#3 0x638dd4e8 in curl_easy_cleanup+0x3c ()

dtor scenario_3
{
        /*Call curl_global_cleanup() immediately before the program exits, when the program is again only one thread
         *and after its last use of libcurl. It isn't actually required that the functions be called at the beginning
         *and end of the program -- that's just usually the easiest way to do it. It is required that the functions
         *be called when no other thread in the program is running.
         */
        curl_global_cleanup();
}
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]
               csCtkXmlEntityResolver::setUpCurlEnvironment() [csCtkXmlEntityResolver.C:286]
                           * for transferring. You must never share the same handle in multiple threads. curl_easy_init initializes
                           * curl and this call MUST have a corresponding call to curl_easy_cleanup() when the operation is complete.
                           */
               => _cURLHandle = curl_easy_init();

                          //If this function returns NULL, something went wrong and you cannot use the other curl functions.
                          if(_cURLHandle)
               csCtkXmlEntityResolver::csCtkXmlEntityResolver(const char *,bool)%2 [csCtkXmlEntityResolver.C:56]
               csCtkXmlDOMParser::parseDocumentUseExternalDTD(char *,char *) [csCtkXmlDOMParser.C:907]
               csCtkXmlDOMParser::isXmlValidUseExternalDTD(char *,const char *) [csCtkXmlDOMParser.C:661]
               csCtkXmlDOMParser::doValidateAgainstExternalDtd(char *,char *) [csCtkXmlDOMParser.C:291]
               csCtkXmlDOMParser::doValidateAgainstExternalDtd(char *) [csCtkXmlDOMParser.C:298]
               doXmlParserSelfTest(int,char **) [testMe.C:109]
               main [testMe.C:59]

dtor scenario_4
{
        /*This function must be the last function to call for an easy session. It is the opposite of
         * the curl_easy_init(3) function and must be called with the same handle as input that the
         * curl_easy_init call returned.
         */
        curl_easy_cleanup(_cURLFileHandle);
}
Results:Program received signal SIGSEGV, Segmentation fault.
=================================================
#0 0x6388d920 in Curl_cookie_loadfiles+0x9c
#1 0x638aec74 in flush_cookies+0x8c ()
#2 0x638af1ac in Curl_close+0x2ac
#3 0x638dd4e8 in curl_easy_cleanup+0x3c ()

-------------------------------------------------------------------
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