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 字节的泄漏不会随着时间的推移而增长,也不会随着连接、循环、句柄等的数量而增长。我总结不严重,随它去吧。 :-)
我从 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 个堆快照的比较。
printf
.
进行
我不明白这是不是正常情况。
你能追踪到哪里进行了分配吗? libuv 可能会分配一些永远不会被释放的全局结构(IIRC 与线程池相关的东西)。
在 Unix 上我们使用析构函数,但您的泄漏检测器也会捕获它们,因为它们 运行 在 main returns.
之后由于这 32 字节的泄漏不会随着时间的推移而增长,也不会随着连接、循环、句柄等的数量而增长。我总结不严重,随它去吧。 :-)