6

メモリリークに関してテストごとにアサーションを作成するために使用できるCppUnitの拡張機能を知っている人はいますか。

つまり、CPPUNIT_ASSERT_NO_LEAKS()?

基本的に、テストの実行によってメモリリークが発生した場合に、特定のテストに失敗できるようにしたいと考えています。

4

8 に答える 8

4

Linux で実行している場合は、memcheckでテストを実行できます。

マニュアルのClient Requestsセクションには、いくつかの便利なマクロが説明されており、そのうちの 1 つがテストに役立つと記されています。

VALGRIND_COUNT_LEAKS: 4 つの引数に、前回のリーク チェックでリーク、疑わしい、到達可能、抑制されていることが判明したメモリのバイト数を入力します。ここでも、 を呼び出した後のテスト ハーネス コードで役立ちVALGRIND_DO_LEAK_CHECKます。

マクロは で定義されておりmemcheck.h(おそらく で/usr/include/valgrind)、必要なシーケンスは次のようになります。

unsigned long base_definite, base_dubious, base_reachable, base_suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(base_definite, base_dubious, base_reachable, base_suppressed);
// maybe assert that they're zero!

// call test

unsigned long leaked, dubious, reachable, suppressed;
VALGRIND_DO_LEAK_CHECK;
VALGRIND_COUNT_LEAKS(leaked, dubious, reachable, suppressed);
CPPUNIT_ASSERT_EQUAL(base_leaked, leaked);
// etc.

すべてのテストでそれを繰り返すのは面倒なので、独自のマクロを作成するか、さらには専用のTestRunnerを作成することをお勧めします。

于 2009-06-16T13:44:53.113 に答える
3

CPPUNIT には、既定ではメモリ リーク チェックがサポートされていません。

プロジェクトは現在再開されています (長い間停止されていました)。これは CPPUNIT2 の機能である可能性があります。作成者に提案 (または書き込み) できます。

メモリ リーク検出をサポートする単体テスト フレームワークを探している場合は、CppUTestを試してみてください。Martin Fowler と Bob Martin がいくつかの TDD コースで使用しているプロジェクトです。それはかなり良いです。

于 2009-06-16T14:06:04.227 に答える
2

Windows では、デバッグ ヒープへのいくつかの呼び出しを使用して、CppUnit が and を使用してこの情報に基づいて動作するようにするのは非常に簡単なこと_CrtMemCheckpoint()です_CrtMemDifference()

欠点があります:

  • チェックポイントを取得するには、テストの開始時に手動で何かを配置する必要があります (おそらく、それを何らかの方法で CppUnit に統合する方法があります)。
  • これは Windows のみです (おそらく、他のさまざまなプラットフォームにも同様のものがあります)。
  • Debug CRT を使用したビルドでのみ機能します。
于 2009-06-16T14:30:04.880 に答える
1

私が働いている場所では、purifyを使用して単体テストを構築しています。次に、継続的インテグレーションプラットフォームは、成功/失敗したテストケースの数とリークされたバイト数(+ lintとコベリティの結果)の両方を取得し、Webページに表示します。このようにすることを強くお勧めします。

あなたが望む解決策を提供しなかったことをお詫びします。

于 2009-06-18T13:44:30.100 に答える
1

この質問に答えるには少し遅すぎることは承知しています。しかし、ここにマイクロソフトの優れたツールがあります。私は現在 Linux ユーザーですが、Windows (Visual C++ および Qt) でコードを書いていたときにこれを使用しました http://www.microsoft.com/en-us/download/details.aspx?id=20028

于 2012-07-09T02:43:45.760 に答える
0

そのことはわかりませんが、Fluid Studiosのメモリマネージャーコードのようなものを使用して、微調整を加えて自分自身にフックすることができます。それを実行するか、テストアプリケーションにコンパイルしてから、テストごとにアプリケーションを1回実行し、メモリ追跡結果を照合するスクリプトを作成します。

于 2009-06-16T13:27:32.680 に答える
0

valgrindで単体テストを実行します。私が使用している単体テスト フレームワークでは、1 つまたは複数の個別の単体テストを実行できるため、リークの原因となっている単体テストを検出できます。

于 2009-06-16T14:15:49.463 に答える
0

CppUnit ではないことはわかっていますが、boost::test はメモリ リークの検出を行うことができます。

http://www.boost.org/doc/libs/1_39_0/libs/test/doc/html/execution-monitor/user-guide.htmlから:

void detect_memory_leaks( bool on_off );

void break_memory_alloc( long mem_alloc_order_num );

于 2009-06-16T23:57:58.790 に答える