首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

libCurl库的curl_easy_perform ()函数导致内存泄露,怎么解决

2014-01-19 
libCurl库的curl_easy_perform ()函数导致内存泄露,如何解决libCurl库的curl_easy_perform ()函数导致内存

libCurl库的curl_easy_perform ()函数导致内存泄露,如何解决
libCurl库的curl_easy_perform ()函数导致内存泄露,如何解决?大家有碰到过吗?
[解决办法]
可以参考一下这个页面里的代码。其中与cleanup关系密切的部分如下


       res = curl_easy_perform(curl);
       timestamp(time_str, sizeof (time_str), FALSE);
       if (CURLE_OK != res) {
               // skipped many error checking lines
                success = FALSE;
        }
        curl_slist_free_all(httpheaders);

        /*
         * whenever we fail, reset curl connection in the hope of
         * keeping mem footprint low.
         * every 5 minutes or more, reset whole curl state
         */
        if (FALSE == success) {
                consecutive_successes = 0;
                if (do_cleanup == FALSE)
                  return;
                time_t  now;
                curl_easy_cleanup(curl);
                now = time(NULL);
                if (last_cleanup == 0) {
                        last_cleanup = now;
                } else if (now - last_cleanup > (5 * 60)) {
                        curl_global_cleanup();
                        if (curl_global_init(curl_glob_arg) != 0) {
                                fprintf(stderr, "periodic re-global-init failed\n");
                                exit(2);
                        }
                }
                *cu = curl_easy_init();
        }

        if (success && (consecutive_successes++ % 10 == 0))
          printf("%s successfully reconnected to %s\n",
                 time_str, url);
}


库本身有问题的可能性微乎其微,还是参考一下别人是如何使用的。
[解决办法]
你是怎么判断这个函数发生泄漏的
[解决办法]
检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!

[解决办法]
引用:
Quote: 引用:

检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象


让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!


任务管理器里面看到内存以10M/秒的速度消耗,几分钟程序就崩溃了,抛出bad_alloc的异常。

libcurl什么版本?
你确定不是循环里其他的代码导致的?
libcurl官网上的介绍里也没说每次调用perform后要记得cleanup
SYNOPSIS

#include <curl/curl.h>

CURLcode curl_easy_perform(CURL * handle ); 

DESCRIPTION

This function is called after the init and all the curl_easy_setopt(3) calls are made, and will perform the transfer as described in the options. It must be called with the same handle as input as the curl_easy_init call returned.

You can do any amount of calls to curl_easy_perform(3) while using the same handle. If you intend to transfer more than one file, you are even encouraged to do so. libcurl will then attempt to re-use the same connection for the following transfers, thus making the operations faster, less CPU intense and using less network resources. Just note that you will have to use curl_easy_setopt(3) between the invokes to set options for the following curl_easy_perform.

You must never call this function simultaneously from two places using the same handle. Let the function return first before invoking it another time. If you want parallel transfers, you must use several curl handles. 

热点排行