Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Куда делась память? [D5]


Страницы:   1 2 3

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 никогда не будет выполнено.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо