代码之家  ›  专栏  ›  技术社区  ›  Jeremy Mayhew

使用CppUnit进行内存泄漏检测

  •  5
  • Jeremy Mayhew  · 技术社区  · 16 年前

    是否有人知道CppUnit的扩展,这些扩展可用于在关于内存泄漏的逐个测试的基础上进行断言。

    i、 e.CPPUNIT_ASSERT_NO_LEAKS()?

    从本质上说,当测试的执行导致内存泄漏时,我希望能够使特定的测试失败。

    8 回复  |  直到 16 年前
        1
  •  4
  •   Greg Bacon    16 年前

    如果你在Linux上运行,你可以使用 memcheck .

    Client Requests 本手册的第节介绍了几个有用的宏,其中一个宏对测试很有用:

    VALGRIND_COUNT_LEAKS :用上次泄漏检查发现的要泄漏、可疑、可访问和禁止的内存字节数填充四个参数。同样,在调用 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

        2
  •  3
  •   Gustavo Muenz    16 年前

    默认情况下,CPPUNIT不支持内存泄漏检查。

    这个项目现在已经重新开始(它已经停止了很长时间),这可能是CPPUNIT2的一个特性,您可以向作者提出建议(或写信)。

    CppUTest . 这是马丁·福勒和鲍勃·马丁在一些TDD课程中使用的项目。很不错。

        3
  •  2
  •   Michael Burr    16 年前

    在Windows上,使用对调试堆的一些调用来让CppUnit使用 _CrtMemCheckpoint() _CrtMemDifference()

    有缺点:

    • 您必须在测试开始时手动放置一些东西来获取检查点(也许有一种方法可以将其集成到CppUnit中)
    • 只是Windows(其他平台上可能也有类似的东西)
        4
  •  1
  •   tombjo    16 年前

    在我工作的地方,我们用purify构建单元测试。然后,我们的持续集成平台将成功/失败的测试用例数和泄漏的字节数(lint和coverity结果)都拉出来并显示在网页上。我强烈建议你这样做。

    很抱歉没有提供您想要的解决方案。

        5
  •  1
  •   Majid Khan    13 年前

    我知道现在回答这个问题有点晚了。但这是微软的一个很好的工具。我现在是Linux用户,但我在Windows中编写代码时使用了这一点(VisualC++和Qt) http://www.microsoft.com/en-us/download/details.aspx?id=20028

        6
  •  0
  •   Dominik Grabiec    16 年前

    不知道,但你可以使用类似于Fluid Studios内存管理器代码的东西,并通过一些调整将其挂在自己身上。或者将其编译到测试应用程序中,然后有一个脚本为每个测试运行一次应用程序,并整理内存跟踪结果。

        7
  •  0
  •   Bruno Rijsman    16 年前

    使用运行单元测试 valgrind . 我使用的单元测试框架允许您运行一个或多个单独的单元测试,这样您就可以检测哪个单元测试导致了泄漏。

        8
  •  0
  •   veroxii    16 年前

    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 );