如何清理一个卷曲手柄?

问题描述 投票:3回答:1

我有以下示例源代码,允许使用libcurl发送HTTP请求。

我注意到大量内存使用。使用valgrind调试显示内存泄漏。即使我使用curl_easy_cleanup()。我也使用curl_easy_reset()curl_global_cleanup(),但它们根本没有任何影响,内存泄漏仍然存在。

我需要知道如何通过libcurl释放已分配的内存。

这里是一个基本的简单源代码,用于启动和清理libcurl。

int main()
{
    CURL* pEasy = NULL;  

    pEasy = curl_easy_init();

    if (pEasy != NULL)
    {
        curl_easy_setopt(pEasy, CURLOPT_USERNAME, "test");
        curl_easy_setopt(pEasy, CURLOPT_PASSWORD, "test");
        curl_easy_setopt(pEasy, CURLOPT_URL, "http:/192.168.22.217:3000");

        curl_easy_perform(pEasy);

        curl_easy_cleanup(pEasy);
    }
 }

Valgrind显示该程序的内存泄漏。

在下面找到valgrind输出

 sudo valgrind --leak-check=full --show-leak-kinds=all ./mem
==7215== Memcheck, a memory error detector
==7215== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==7215== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==7215== Command: ./mem
==7215== 



==7215== 
==7215== HEAP SUMMARY:
==7215==     in use at exit: 6,957 bytes in 67 blocks
==7215==   total heap usage: 1,445 allocs, 1,378 frees, 199,287 bytes allocated
==7215== 
==7215== 3 bytes in 1 blocks are still reachable in loss record 1 of 60
==7215==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7215==    by 0x5136489: strdup (strdup.c:42)
==7215==    by 0x5E65B14: PR_NewLogModule (in /usr/lib/x86_64-linux-gnu/libnspr4.so)
==7215==    by 0x5E707A9: ??? (in /usr/lib/x86_64-linux-gnu/libnspr4.so)
==7215==    by 0x4E8FB38: ??? (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x4E67344: ??? (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x4E674F7: curl_easy_init (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x400872: main (in /home/mem_test/mem)
==7215== 
==7215== 3 bytes in 1 blocks are still reachable in loss record 2 of 60
==7215==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7215==    by 0x5136489: strdup (strdup.c:42)
==7215==    by 0x5E65B14: PR_NewLogModule (in /usr/lib/x86_64-linux-gnu/libnspr4.so)
==7215==    by 0x5E7081B: ??? (in /usr/lib/x86_64-linux-gnu/libnspr4.so)
==7215==    by 0x4E8FB38: ??? (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x4E67344: ??? (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x4E674F7: curl_easy_init (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x400872: main (in /home/mem_test/mem)
==7215== 
==7215== 4 bytes in 1 blocks are still reachable in loss record 3 of 60
==7215==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7215==    by 0x5136489: strdup (strdup.c:42)
==7215==    by 0x5E65B14: PR_NewLogModule (in /usr/lib/x86_64-linux-gnu/libnspr4.so)
==7215==    by 0x5E707BC: ??? (in /usr/lib/x86_64-linux-gnu/libnspr4.so)
==7215==    by 0x4E8FB38: ??? (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x4E67344: ??? (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x4E674F7: curl_easy_init (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x400872: main (in /home/mem_test/mem)
==7215== 
......................
==7215== 
==7215== 1,344 bytes in 8 blocks are still reachable in loss record 60 of 60
==7215==    at 0x4C2FB55: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==7215==    by 0x5E79749: PR_NewMonitor (in /usr/lib/x86_64-linux-gnu/libnspr4.so)
==7215==    by 0x5E6995D: ??? (in /usr/lib/x86_64-linux-gnu/libnspr4.so)
==7215==    by 0x5E70899: ??? (in /usr/lib/x86_64-linux-gnu/libnspr4.so)
==7215==    by 0x4E8FB38: ??? (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x4E67344: ??? (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x4E674F7: curl_easy_init (in /usr/lib/x86_64-linux-gnu/libcurl-nss.so.4.4.0)
==7215==    by 0x400872: main (in /home/mem_test/mem)
==7215== 
==7215== LEAK SUMMARY:
==7215==    definitely lost: 0 bytes in 0 blocks
==7215==    indirectly lost: 0 bytes in 0 blocks
==7215==      possibly lost: 0 bytes in 0 blocks
==7215==    still reachable: 6,957 bytes in 67 blocks
==7215==         suppressed: 0 bytes in 0 blocks
==7215== 
==7215== For counts of detected and suppressed errors, rerun with: -v
==7215== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

如何正确清洁卷曲记忆?

c++ c curl memory-leaks libcurl
1个回答
3
投票

curl_global_init(0)之前做一个curl_easy_init()并在curl_global_cleanup()之后做一个卷曲curl_easy_cleanup()似乎解决了这个问题

==21041== Memcheck, a memory error detector
==21041== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==21041== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==21041== Command: ./a.out
==21041== 
==21041== 
==21041== HEAP SUMMARY:
==21041==     in use at exit: 0 bytes in 0 blocks
==21041==   total heap usage: 1,452 allocs, 1,452 frees, 418,773 bytes allocated
==21041== 
==21041== All heap blocks were freed -- no leaks are possible
==21041== 
==21041== For counts of detected and suppressed errors, rerun with: -v
==21041== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
© www.soinside.com 2019 - 2024. All rights reserved.