Boost.Test不会将内存泄漏视为失败

时间:2015-05-16 04:39:56

标签: boost boost-test

#define BOOST_TEST_MODULE test
#include <boost/test/unit_test.hpp>

BOOST_AUTO_TEST_CASE(test)
{
    int * i = new int;
    BOOST_CHECK(i==0);
}

以上测试用例显然失败了。内存泄漏也是报道的。 但是,如果我将测试从i==0更改为i!=0,则成功没有问题,并且不关心是否存在内存泄漏。

这是一个错误还是我错过了一些配置来使Boost.Test将内存泄漏视为失败?

修改

如果内存泄漏,可以轻松扩展Boost.Test以使测试失败。对于未来的读者,我包括我的解决方案:

#define MY_TEST_CASE(name)              \
    void my_test_cases__##name();       \
    BOOST_AUTO_TEST_CASE(name)          \
    {                                   \
        mytests::heap heap_scope;       \
        my_test_cases__##name();        \
        (void)heap_scope;               \
    }                                   \
    void my_test_cases__##name()

namespace mytests
{
    class heap
    {
#   if !defined(NDEBUG) && defined(_MSC_VER)
    public:
        heap()
        {
            _CrtMemCheckpoint(&oldState);
        }

        ~heap()
        {
            _CrtMemState curState, diffState;

            _CrtMemCheckpoint(&curState);

            int leaked_memory = _CrtMemDifference(&diffState,&oldState,&curState);

            BOOST_REQUIRE(leaked_memory==0);
        }

    private:
        _CrtMemState oldState;
#   endif
    };
}

然后只使用MY_TEST_CASE代替BOOST_AUTO_TEST_CASE

MY_TEST_CASE(test)
{
    // various
    // tests
    // .
    // .
    // .
}

如果任何堆内存泄漏,您的单元测试将报告错误并失败。

1 个答案:

答案 0 :(得分:0)

Boost Test是一个单元测试框架。

泄漏检测不是核心功能。

文档说:

  

Memory leaks detection

     

执行监视器提供有限能力,用于在程序执行期间检测内存泄漏,并在特定内存分配顺序号上中断程序执行(1 - 程序中第一次分配内存,2秒等等)。

     

很遗憾目前,此功能仅适用于Microsoft系列编译器(以及英特尔,如果它使用Microsoft C运行时库)。

     

此外,它无法针对每个监视器实例进行调整,并且仅在全局程序执行完成后全局触发并报告。在未来,这应该得到改善。