0

を使用してマルチスレッド HTTP プロキシを作成しlibcurlました。問題は、アプリケーションが使用する RAM が時間とともに増加することです (http 要求に応答した後)。

動的に割り当てられたすべての変数と、によって使用されるヘッダーリストを解放することを確信しています。また、すべてのリクエストの後libcurlに実行します。しかし、アプリケーションをデバッグした後、1バイトも解放されないことがcurl_easy_cleanupわかりました(削除した後、アプリケーションは同じ量のメモリを使用します)curl_easy_cleanup

メモリ使用量は最初は急激に増え、その後ゆっくりと増えていきます(全く増えないこともあります)

アプリケーションがかなりの量のメモリを解放する唯一の瞬間は、ブラウザを閉じたときです (ただし、アプリケーションが起動されたときに最初に使用された量までではありません)。

Valgrind は確実にメモリ リークを通知しません (いくつかのメモリ リークの可能性がありますが、ほんの数バイトfreeです) curl_easy_cleanup curl_global_cleanup

4

1 に答える 1

1

アプリケーションが使用するメモリの総量を表示しているように思えます。これがダウンすることはめったになく、非常に大量のメモリが一度に解放された場合にのみ発生します。

これは、アプリケーションが使用するヒープ自体は解放されず、ヒープに入る小さなブロックのみが解放されるためです。このブロックは、そのサイズのブロックが必要になったとき、newまたは次に必要になったときに再利用されます。malloc

言い換えれば、アプリケーションのメモリ使用量の「最高水準点」がしばらく上昇し、あるレベルに落ち着くまで表示されているということです。これが、valgrind が何も検出しない理由です。実際に「リーク」しているわけではありません。プログラムの実行中に行ったすべての割り当てに対応できるようになるまでヒープを増やしているだけです。

このコードを試すことができます:

#include <iostream>

using namespace std;

int main()
{
   int *mem[10000];
   string dummy;
   for(int i = 0; i < 10000; i++)
   {
      mem[i] = new int [256];  // 1KB of memory. 
   }
   cout << "Hit enter to continue..." << endl;
   cin >> dummy;
   for(int i = 0; i < 10000; i++)
   {
      delete [] mem[i];
   }
   cout << "Hit enter to exit..." << endl;
   cin >> dummy;

}

アプリケーションが 10MB 程度まで大きくなると、すべてが削除されますが、同じサイズのままです。

于 2013-07-07T21:52:08.337 に答える