![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Куда делась память? [D5]
MegaVolt © (2006-03-03 11:52:00)Вот код показывающий потерю памяти. Как избежать потери?
procedure TForm1.Button1Click(Sender: TObject);
Var
Mem:integer;
begin
Mem:=GetHeapStatus.TotalCommitted+GetHeapStatus.TotalAllocated;
ShowMessage('Теряем память');
Mem:=GetHeapStatus.TotalCommitted+GetHeapStatus.TotalAllocated-Mem;
if mem<>0 then ShowMessage(IntToStr(Mem));
end;
Сергей М. (2006-03-03 12:59:00) [41]
> проверить это без сторонних прог неполучится?
Если ты озаботился потенциальной утечкой памяти в своем приложении, проверять свое предположение вполне можно и таким способом. Но при условии что утечка подозревается в каких-то циклических (одних и тех же) программных действиях, заведомо не предполагающих прогрессирующего приращения объема выделяемой памяти - просто ставишь код проверки в итерацию цикла и пишешь результат в лог для последующего анализа.
Desdechado (2006-03-03 12:57:00) [42]память выделяется менеджером неявно, например, при вызове функций, при изменении длины строк и прочее
но это все тем же менеджером отслеживается и повторно используется по возможности
главное - не терять память, которая выделяется явно (Malloc, GetMen, Create и т.п.)
MegaVolt (2006-03-03 12:52:00) [43]Ну тут нету вообще Среате а память выделилась. И когда она освободится непонятно. По идее по завершению работы приложения. И получается что проверить это без сторонних прог неполучится?
Desdechado (2006-03-03 12:50:00) [44]проверить, все ли Create имеют свои Free
MegaVolt (2006-03-03 12:27:00) [45]Как тогда проверить есть ли утечки в программе или нет? Из самой программы?
Сергей М. (2006-03-03 12:24:00) [46]Память никуда не делась.
При первом вызове ShowMessage() Borland Memory Manager взял из кучи требуемое кол-во памяти, но обратно не отдал (пометил в своих структурах как свободную), чтобы при последующих запросах памяти не было нежелательных (с т.з. производительности) обращений к куче.
Считай что это своего рода мешанизм кэширования.
Сергей М. (2006-03-03 12:19:00) [47]Нет здесь никакой потери памяти.
Сообщение ShowMessage(IntToStr(Mem)); ты увидишь единожды, при первом клике на кнопке (и это нормально и вполне объяснимо).
После этого хоть миллион раз кликай - условие mem<>0 никогда не будет выполнено.