C++ - Действительно ли возможно реализовать тестирование утечки памяти в модульном тесте?

Я пытаюсь реализовать поблочное тестирование на свой код, и мне нелегко делать его.

Идеально я хотел бы протестировать некоторые классы не только для хорошей функциональности, но также и для надлежащего выделения памяти / освобождение. Интересно, может ли эта проверка быть сделана с помощью платформы поблочного тестирования. Я использую Визуальный, Утверждают btw. Я хотел бы видеть некоторый пример кода, если возможный!

17
задан sevaxx 5 June 2010 в 15:23
поделиться

3 ответа

Функцию отладки можно использовать прямо в студии разработки для выполнения проверки на утечки - если ваши модульные тесты выполняются с использованием среды выполнения отладки c-runtime.

Простой пример мог бы выглядеть примерно так:

#include <crtdbg.h>
struct CrtCheckMemory
{
  _CrtMemState state1;
  _CrtMemState state2;
  _CrtMemState state3;
  CrtCheckMemory()
  {
    _CrtMemCheckpoint(&state1);
  }
  ~CrtCheckMemory()
  {
    _CrtMemCheckpoint(&state2);
    // using google test you can just do this.
    EXPECT_EQ(0,_CrtMemDifference( &state3, &state1, &state2));
    // else just do this to dump the leaked blocks to stdout.
    if( _CrtMemDifference( &state3, &state1, &state2) )
      _CrtMemDumpStatistics( &state3 );
  }
};

И использовать его в модульном тесте:

UNIT_TEST(blah)
{
  CrtCheckMemory check;

  // TODO: add the unit test here

}

Некоторые инфраструктуры модульного тестирования выделяют свои собственные ресурсы - например, Google выделяет блоки, когда модульный тест не проходит, поэтому любой тест блок, у которого произошел сбой по любой другой причине, всегда также имеет ложноположительную «утечку».

15
ответ дан 30 November 2019 в 13:33
поделиться

Вы можете обнаружить утечку памяти в тестах, предоставив собственную реализацию функций new, delete, malloc и free, добавив информацию об отслеживании памяти при распределении.

1
ответ дан 30 November 2019 в 13:33
поделиться

Вы можете использовать библиотеку распределения Google tcmalloc , которая предоставляет heapchecker .

(Обратите внимание, что проверка кучи может добавить заметные накладные расходы на производительность вашей программы, поэтому вы вероятно хотите включить ее только в отладочных сборках или модульных тестах.)

И вы запросили пример кода, так что вот она .

5
ответ дан 30 November 2019 в 13:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: