Тестируем классы на утечку памяти (GlobalMemoryStatus, MemAvail).
В этом уроке вам понадобиться материал (программные коды) предыдущих уроков:
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; |
Как видим, после ста создаваний и удалений объекта объем памяти не уменьшился. Следовательно, в этом классе утечки памяти нет.
Сделаем еще один тест. Закомментарим строку
FPriceSource.LoadDataFromTextFile(odOpenDialog.FileName);
и увеличим количество повторений цикла до 100000. Смотрим результат:
Теперь перейдем к классу 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; |
Вот что выдала программа:
Как видим, и в этом классе тоже не возникает утечки памяти.
Теперь проверим класс 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; |
На этом мы закончим тестирование классов, класс TPASSStatStoreDataList проверять не будем, он является вспомогательным, но если хотите, то протестируйте его самостоятельно и убедитесь, что и в нем нет утечки памяти.