.
Урок 11. Тестируем классы на утечку памяти (GlobalMemoryStatus, MemAvail).
Автор megabax   
03.12.2009 г.
New Page 1

Тестируем классы на утечку памяти (GlobalMemoryStatus, MemAvail).

Все статьи по данной теме.

В этом уроке вам понадобиться материал (программные коды) предыдущих уроков:

Сначала мы проверим класс TPASSPriceSource. Это можно сделать вот такой программкой (кинем сперва на форму компонент TListBox и назовем его lbMemory) :

procedure TfrmMomentum.itLoadClick(Sender: TObject);
var lpBuffer: TMemoryStatus; i:integer;
begin
     GlobalMemoryStatus(lpBuffer);
     lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
     FloatToStr(lpBuffer.dwAvailVirtual));
     if odOpenDialog.Execute then
     begin
        for i:=1 to 100 do
        begin
            if FPriceSource<>nil then FreeAndNil(FPriceSource);
            FPriceSource:=TPASSPriceSource.Create(odOpenDialog.FileName,false);
            FPriceSource.LoadDataFromTextFile(odOpenDialog.FileName);
        end;
     end;
     lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
     FloatToStr(lpBuffer.dwAvailVirtual))
end;

вот что она нам выдаст:

утечка памяти (GlobalMemoryStatus, MemAvail)

Как видим, после ста создаваний и удалений объекта объем памяти не уменьшился. Следовательно, в этом классе утечки памяти нет.

Сделаем еще один тест. Закомментарим строку

FPriceSource.LoadDataFromTextFile(odOpenDialog.FileName);

и увеличим количество повторений цикла до 100000. Смотрим результат:

утечка памяти (GlobalMemoryStatus, MemAvail)

 

Теперь перейдем к классу TPASSMomentum:

procedure TfrmMomentum.btnTestClick(Sender: TObject);
var lpBuffer: TMemoryStatus; i:integer;
begin
      GlobalMemoryStatus(lpBuffer);
      lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
              FloatToStr(lpBuffer.dwAvailVirtual));
      for i:=1 to 100000 do
      begin
         if FIndicator<>nil then FreeAndNil(FIndicator);
         FIndicator:=TPASSMomentum.Create(3,'Close');
      end;
      lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
              FloatToStr(lpBuffer.dwAvailVirtual))
end;

Вот что выдала программа:

утечка памяти (GlobalMemoryStatus, MemAvail)

Как видим, и в этом классе тоже не возникает утечки памяти.

Теперь проверим класс TPASSStatAnalizMomentum:

procedure TfrmMomentum.btnTestClick(Sender: TObject);
var lpBuffer: TMemoryStatus; i:integer; SA:TPASSStatAnalizMomentum;
begin
    GlobalMemoryStatus(lpBuffer);
    lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
    FloatToStr(lpBuffer.dwAvailVirtual));
    for i:=1 to 100000 do
    begin
         SA:=TPASSStatAnalizMomentum.Create(nil,10, nil);
         SA.Free;
    end;
    lbMemory.Items.Add(FloatToStr(lpBuffer.dwAvailPhys)+' --- '+
    FloatToStr(lpBuffer.dwAvailVirtual))
end;

Вот что выдала нам программа:
утечка памяти (GlobalMemoryStatus, MemAvail)

На этом мы закончим тестирование классов, класс TPASSStatStoreDataList проверять не будем, он является вспомогательным, но если хотите, то протестируйте его самостоятельно и убедитесь, что и  в нем нет утечки памяти.

 

 

Последнее обновление ( 04.07.2013 г. )