2016-12-08 5 views
0

私はlibuv-bookからhttps://nikhilm.github.io/uvbook/basics.htmlをコードスニペットを取り、次の簡単なコードでメモリリークのためにそれをテストした:デバッグウィンドウでlibuvには最も簡単な例でメモリリークがありますか?

#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. 

ない大きな漏れが、それはです! テストしてください。バグレポートを作成する必要がありますか?


更新。このリークはループの数に依存しません。 (私は慎重にテストしなかったし、深くは行っていない)。

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つのヒープスナップショットの比較を示します。 http://image.prntscr.com/image/a42cf8945eaa4cb58a94eaea1e7c099e.png 割り当てが行われ、割り当てが解除されていません。そのうちの1つがprintfで作成されました。
これが通常の状況であるかどうかわかりません。

答えて

0

これらの32バイトのリークは、時間の経過と共に増加するものではなく、接続数、ループ、ハンドル数などに亘って増加しないため、は深刻ではないとまとめています。 :-)

1

割り当ての場所をどこからトレースできますか? libuvは決して割り当てが解除されないいくつかのグローバル構造(スレッドプールに関連する何かIIRC)を割り当てるかもしれません。

Unixではデストラクタを使用していますが、リターンディテクタはメインリターン後に実行されるため、リークディテクタもそれらをキャッチします。

+0

私は深くトレースするのに十分ではありませんでしたが、この32バイトのリークは時間の経過とともに増加するわけではなく、接続数、ループ数、ハンドル数などでは増加しません。そしてそれをさせてください。** :) – kyb

関連する問題