libuv 在最简单的例子中有内存泄漏吗?

libuv has memory leaks in simpliest example?

我从 libuv-book https://nikhilm.github.io/uvbook/basics.html 中获取了代码片段,并使用下一个简单代码对其进行了内存泄漏测试:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>  
#include <crtdbg.h>  
#include <stdio.h>
#include <uv.h>


int TestMemLeakage_uv_loop() 
{
   uv_loop_t *loop = (uv_loop_t*)malloc(sizeof(uv_loop_t));
   uv_loop_init(loop);

   printf("Now quitting.\n");
   uv_run(loop, UV_RUN_DEFAULT);

   uv_loop_close(loop);
   free(loop);
   return 0;
}

void main(void)
{
   _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
   TestMemLeakage_uv_loop();
}

调试面板中的输出:

Detected memory leaks!
Dumping objects ->
{96} normal block at 0x0095B718, 32 bytes long.
 Data: <                > 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
Object dump complete.

泄漏不大但确实如此! 请测试一下。我应该创建错误报告吗?


Update. 此泄漏不依赖于循环数。 (我没有仔细测试,没有深入)。下一个代码导致相同的内存泄漏:

void main(void)
{
   _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
   for(int i=0; i<100; ++i)
       TestMemLeakage_uv_loop();
}

Upd2. 这里是 TestMemLeakage_uv_loop() 之前和之后的 2 个堆快照的比较。 进行了 180 次分配但未取消分配,其中 1 次由 printf.
进行 我不明白这是不是正常情况。

你能追踪到哪里进行了分配吗? libuv 可能会分配一些永远不会被释放的全局结构(IIRC 与线程池相关的东西)。

在 Unix 上我们使用析构函数,但您的泄漏检测器也会捕获它们,因为它们 运行 在 main returns.

之后

由于这 32 字节的泄漏不会随着时间的推移而增长,也不会随着连接、循环、句柄等的数量而增长。我总结不严重,随它去吧。 :-)