Тестирование.Потери памяти
Как уже говорилось (Тестирование.Выполнение.Условия успешного выполнения), состояние менеджера памяти проверяется до и после выполнения тестирующего метода. В случае, если состояние меняется, в файл записывается сообщение. Например, поробуем распределить блок памяти и не освободить его:

pascal
procedure TMyClass.test_method6;
var P:Pointer;
begin
   GetMem(P, 10);
end;

output
 18.06.2009 21:24 Message : TMyClass.test_method6
 18.06.2009 21:24 Error   : LostMemory : 12

К сожалению не все так просто. Отложенное распределение или освобождение памяти будет приводить к сообщениях об ошибках там, где их нет.

Поэтому в классе Tests добавлен метод TestMemory. Вызов этого метода с параметром false отменяет контроль распределения памяти, с параметром true - включает. Все расперделения, сделанные в момент, когда контроль выключен, не учитываются. Например, если мы знаем, что вызов метода приведет к распределению памяти, но наш метод не имеет контроля над ней (освобождение будет произведено позже и неизвестно в какой момент времени), можно на время отключить контроль:

pascal
  tests.TestMemory(false);
  P := Pool.GetMem(1024);   // Распределение памяти в пуле
  tests.TestMemory(true);
  //...
  tests.TestMemory(false);
  Pool.FreeMem(P);          // Указание - память больше не используется
  // Реальное освобождение будет произведено позже
  tests.TestMemory(true);

Контроль памяти автоматически включается в начале каждого тестирующего метода.

Еще один метод контроля за распределение памяти - вызов Tests.ReportMemoryOnShutdown. Этот вызов просто включает:

pascal
   ReportMemoryLeaksOnShutdown := true;

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

Copyright © 2009-2014 by