Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/26: Рейтинг темы: голосов - 26, средняя оценка - 4.73
 Аватар для fort
8 / 8 / 2
Регистрация: 30.04.2013
Сообщений: 75

Как проверить очищена ли память при завершении приложения

05.05.2013, 21:03. Показов 5621. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В приложении динамически создается много переменных: компонентов, классов, Tlist, TStringList.
Есть ли возможность в дельфи проверить, все ли они очистились после завершения работы программы?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.05.2013, 21:03
Ответы с готовыми решениями:

QThread как очищать память при завершении работы потока?
В моей минипрограммке используется класс наследованный от QThread. Этот объект в качестве полей класса имеет динамически создаваемые...

Не очищается память при завершении потока
Добрый день уважаемые форумчане. Из главного потока создаю поток который работает в цикле while not Terminated do. В этом цикле при...

Финализация объекта при завершении приложения
Необходимо, чтобы приложение выполняло ряд заключительных действий перед тем, как уйти в небытие. Дополнение метода finalize() не дает...

7
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
05.05.2013, 21:07
использовать сторонние утилиты и менеджеры памяти
написать свой менеджер памяти
2
 Аватар для Fenix_dragon
118 / 118 / 2
Регистрация: 29.01.2013
Сообщений: 437
05.05.2013, 21:09
fort, по правилу хорошег тона, всё что породил, надо уничтожить!

Добавлено через 10 секунд
самостоятельно
0
 Аватар для fort
8 / 8 / 2
Регистрация: 30.04.2013
Сообщений: 75
05.05.2013, 21:20  [ТС]
Fenix_dragon - совершенно согласен, хочу проверить.
Просто их много - создаются в одних процедурах ... передаются в другие.
------------------------------------------------------------------------------
cotseec - А не знаешь ли, есть какие-нибудь утилиты чтобы большой и объемный код в графическом виде представить. Ну или правила написания больших приложений позволяющие повысить прозрачность всего кода?
0
1085 / 571 / 79
Регистрация: 07.04.2011
Сообщений: 971
Записей в блоге: 2
05.05.2013, 21:20
Есть ли возможность в дельфи проверить, все ли они очистились после завершения работы программы?
Для delphi 7, как сказал cotseec. Если новее, в главном проекте перед Application.Initialize поставить ReportMemoryLeaksOnShutdown
Delphi
1
2
3
4
5
............
begin
   ReportMemoryLeaksOnShutdown := True;
   Application.Initialize;
......
2
 Аватар для fort
8 / 8 / 2
Регистрация: 30.04.2013
Сообщений: 75
05.05.2013, 21:28  [ТС]
ага, вот они попались, спасибо))
Миниатюры
Как проверить очищена ли память при завершении приложения  
0
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
05.05.2013, 21:34
по поводу графического вида - не знаю, не требовалось, по поводу правил написания - использовать стандарт оформления или наиболее удобное для себя - то, что дает наибольшие удобства, если пишешь один, а если в команде - командный стандарт
1
 Аватар для Mawrat
13114 / 5895 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
06.05.2013, 00:08
Я уже где-то писал, как в Delphi 7 можно исследовать приложение на предмет утечек памяти. Повторю здесь.

В каждый момент времени можно посмотреть сколько имеется выделенных (не освобождённых) блоков и какой суммарный объём памяти эти блоки занимают. Не освобождённые блоки - это все выделенные блоки. Среди них могут быть и потерянные и не потерянные.
Сколько выделено блоков и какой их суммарный размер в байтах:
Delphi
1
2
3
4
5
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage('Всего выделено блоков: ' + IntToStr(AllocMemCount)
    + #13#10'Суммарный размер блоков: ' + IntToStr(AllocMemSize));
end;
Соответственно, если в самом конце программы вызвать AllocMemCount() и если окажется, что эта функция вернёт ненулевое значение - значит имеются потерянные блоки.
Делается это таким образом.
1. Создаём модуль, например, с именем UnitMemTest:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
unit UnitTestMem;
 
interface
 
implementation
 
uses
  Windows;
 
initialization
 
finalization
 
begin
  //Проверка на неосвобождённые блоки.
  if AllocMemCount <> 0 then
    MessageBox(0, 'Есть неосвобождённые блоки', 'Отчёт',
      MB_OK + MB_ICONINFORMATION + MB_APPLMODAL)
  else
    MessageBox(0, 'Все блоки освобождены', 'Отчёт',
      MB_OK + MB_ICONINFORMATION + MB_APPLMODAL);
end;
 
end.
Здесь следует обратить внимание на то, что в коде, где выполняется вызов AllocMemCount() не используются никакие переменные - это условие обязательно должно выполняться. Это гарантирует, что сам этот код не потребует выделений памяти.
2. Следующий шаг - модуль UnitTestMem надо добавить в файл проекта *.dpr (например - Project1.dpr) и он должен быть записан первым в списке uses. Ещё раз обращу внимание - модуль должен быть указан именно в DPR файле и должен быть обязательно первым в списке uses:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
program Project1;
 
uses
  {Модуль UnitTestMem должен быть первым в списке uses.}
  UnitTestMem in 'UnitTestMem.pas',
  Forms,
  Unit1 in 'Unit1.pas' {Form1};
 
{$R *.res}
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
3. Теперь надо скомпилировать проект и запустить приложение. При выходе из приложения появится окно сообщения, которое известит - все ли блоки освобождены.
---
Можно более сложные проверки делать. Для этого надо перехватить 2 функции менеджера памяти Delphi - запрос на выделение памяти и на освобождение памяти. И таким образом в самой программе вести учёт выделенных/освобождённых блоков.
Есть также специальное ПО для отслеживания утечек памяти в программах на Delphi.

cotseec выше в теме дал ссылки - вот по ним более подробные сведения можно получить.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.05.2013, 00:08
Помогаю со студенческими работами здесь

Краш Windows при завершении приложения
Создаю окно в полноэкранном режиме, приложение работает нормально, но при завершении крашится система (BlueScreen, впервые такое вижу на...

Закрыть все работающие потоки при завершении работы приложения
В некоторых случах после закрытия приложения студия выдает следующую ошибку: Error 12 Unable to copy file...

Как при закрытии приложения проверить уничтожен ли поток
В процессе работы приложения воздействуя на Button1 я уничтожаю поток, тогда при закрытии приложения оно виснет. По какому критерию...

Как проверить, есть ли подключение к БД при запуске приложения?
Проверять при крите главной формы, разумеется нельзя, т.к. datamodule запускается первым, иначе будет Access Volation... Т.е. получается...

Как проверить при публикации, что версия ОС удовлетворяет требованиям приложения?
Доброго дня. Собираю установщик моей программы для CD/DVD. Как я могу выбрать операционные системы, на каких это приложение будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru