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

XM3990205HZ2552 2014-01-16 10:07:54
libCurl库的curl_easy_perform ()函数导致内存泄露,如何解决?大家有碰到过吗?
...全文
3796 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
XM3990205HZ2552 2014-07-23
  • 打赏
  • 举报
回复
引用 20 楼 hujkay 的回复:
此问题和这个问题是一模一样的,可以参考下 《vc编译libcurl的问题》 http://bbs.csdn.net/topics/390421582?page=1#post-396858587
sorry,我现在才看到您的回复,最后的方法是参照7楼i提供的, --------------------- “先将有内存泄漏的功能单独拎出来放在一个独立的进程中, 然后选择某个IPC机制调用该进程。 (利用操作系统退出进程时自动收回其申请内存的功能) 参考《Unix编程艺术》” --------------------- 后来我试过不用这个库自己用windows api写这个功能发现还是有问题,所以觉得可能不是这个库导致内存泄露.....最后采用7楼的方法解决的
  • 打赏
  • 举报
回复
此问题和这个问题是一模一样的,可以参考下 《vc编译libcurl的问题》 http://bbs.csdn.net/topics/390421582?page=1#post-396858587
  • 打赏
  • 举报
回复
这个内存泄露的问题,你是如何解决的?
引用 17 楼 u011021711 的回复:
[quote=引用 16 楼 luciferisnotsatan 的回复:] http://curl.haxx.se/libcurl/c/curl_slist_append.html curl_slist_append用完需要curl_slist_free_all
这些都有写..我刚才调试才发现另外有几个线程都在执行,应该是其他线程里的问题..[/quote]
  • 打赏
  • 举报
回复
我也碰到了,这个问题确实很严重,我程序运行了半天之后,直接就把内存给吃光了,最好都把电脑给干死机了
luciferisnotsatan 2014-01-17
  • 打赏
  • 举报
回复
http://curl.haxx.se/libcurl/c/curl_slist_append.html curl_slist_append用完需要curl_slist_free_all
XM3990205HZ2552 2014-01-17
  • 打赏
  • 举报
回复
引用 16 楼 luciferisnotsatan 的回复:
http://curl.haxx.se/libcurl/c/curl_slist_append.html curl_slist_append用完需要curl_slist_free_all
这些都有写..我刚才调试才发现另外有几个线程都在执行,应该是其他线程里的问题..
derekrose 2014-01-16
  • 打赏
  • 举报
回复
引用 4 楼 u011021711 的回复:
[quote=引用 2 楼 derekrose 的回复:] 你是怎么判断这个函数发生泄漏的
这个函数用在一个循环内部,我在循环内部单步调试,每次执行完这个函数,任务管理器里面就看到内存有消耗,而且是只增不减。[/quote] 看一下demo是如何使用的 看看文档
赵4老师 2014-01-16
  • 打赏
  • 举报
回复
先将有内存泄漏的功能单独拎出来放在一个独立的进程中, 然后选择某个IPC机制调用该进程。 (利用操作系统退出进程时自动收回其申请内存的功能) 参考《Unix编程艺术》
XM3990205HZ2552 2014-01-16
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
任务管理器里面看到内存以10M/秒的速度消耗,几分钟程序就崩溃了,抛出bad_alloc的异常。
XM3990205HZ2552 2014-01-16
  • 打赏
  • 举报
回复
引用 1 楼 ALNG 的回复:
可以参考一下这个页面里的代码。 库本身有问题的可能性微乎其微,还是参考一下别人是如何使用的。
谢谢了!我这边的程序跟你提供的是差不多的.因为是以前的员工写的,所以也不知道如何改。
XM3990205HZ2552 2014-01-16
  • 打赏
  • 举报
回复
引用 2 楼 derekrose 的回复:
你是怎么判断这个函数发生泄漏的
这个函数用在一个循环内部,我在循环内部单步调试,每次执行完这个函数,任务管理器里面就看到内存有消耗,而且是只增不减。
赵4老师 2014-01-16
  • 打赏
  • 举报
回复
检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
derekrose 2014-01-16
  • 打赏
  • 举报
回复
你是怎么判断这个函数发生泄漏的
孩皮妞野 2014-01-16
  • 打赏
  • 举报
回复
可以参考一下这个页面里的代码。其中与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);
}
库本身有问题的可能性微乎其微,还是参考一下别人是如何使用的。
XM3990205HZ2552 2014-01-16
  • 打赏
  • 举报
回复
下班了,明天在弄了...非常感谢大家热心的解答!
XM3990205HZ2552 2014-01-16
  • 打赏
  • 举报
回复
引用 13 楼 luciferisnotsatan 的回复:
网上找到一个内存泄露的,2005的,但那个是linux下的glibc导致的。你这代码应该是windows里的吧。
嗯.是windows上的...请问我就来回单步调试这个循环里的几句话,其他的线程会执行吗?
luciferisnotsatan 2014-01-16
  • 打赏
  • 举报
回复
网上找到一个内存泄露的,2005的,但那个是linux下的glibc导致的。你这代码应该是windows里的吧。
XM3990205HZ2552 2014-01-16
  • 打赏
  • 举报
回复
[/quote]
libcurl什么版本?
你确定不是循环里其他的代码导致的?
libcurl官网上的介绍里也没说每次调用perform后要记得cleanup
[/quote]
不是最新版的,循环里单步调试只要执行完perform就看到内存有消耗,用_crtdumpmemoryleaks()查看发现perform内部确实是申请了内存。 虽然也cleanup了,但是任务管理器里面看到内存的消耗是只增不减的.
luciferisnotsatan 2014-01-16
  • 打赏
  • 举报
回复
引用 6 楼 u011021711 的回复:
[quote=引用 3 楼 zhao4zhong1 的回复:] 检查是否资源泄漏的办法之一: 在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!
任务管理器里面看到内存以10M/秒的速度消耗,几分钟程序就崩溃了,抛出bad_alloc的异常。[/quote] 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.
XM3990205HZ2552 2014-01-16
  • 打赏
  • 举报
回复
引用 8 楼 derekrose 的回复:
看一下demo是如何使用的 看看文档
看了好多次了...
加载更多回复(1)

24,860

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧