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 ответ

Решение

Boost Test является структурой модульного тестирования.

Обнаружение утечек не является основной функцией.

В документации сказано:

Обнаружение утечек памяти

Монитор выполнения предоставляет ограниченную возможность обнаруживать утечки памяти во время выполнения программы и прерывать выполнение программы по определенному порядку-номеру выделения памяти (1 - первое выделение памяти в программе, 2 - второе и т. Д.).

К сожалению, в настоящее время эта функция реализована только для семейства компиляторов Microsoft (и Intel, если она использует Microsoft C Runtime Library).

Кроме того, он не может быть настроен для каждого экземпляра монитора и запускается только глобально и сообщается после завершения всего выполнения программы. В будущем это должно быть улучшено.

Другие вопросы по тегам