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).
Кроме того, он не может быть настроен для каждого экземпляра монитора и запускается только глобально и сообщается после завершения всего выполнения программы. В будущем это должно быть улучшено.