Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
64 / 64 / 10
Регистрация: 19.10.2009
Сообщений: 234

Формы, память

08.11.2010, 09:43. Показов 2209. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Не знаю что уже и делать, иметься приложение в нем одна форма все остальные создаются динамически примерно вот так
C++
1
2
3
4
5
6
7
8
9
10
11
TForm1 *Fom1;
try
{
    Fom1= new TForm1 (this);
    Fom1->ShowModal();
}
__finally
{
    delete Fom1;
    Fom1= NULL;
}
так вот почему, это я и хочу узнать, при создании формы память в диспетчере увеличивается например на 400 кб а при удаление освобождается только 150 кб, всё бы ничего но только приложение очень редко закрывают с ним могут работать и месяц и более пока не отрубиться электричество или не вылетит ошибка за это время память возрастает до немыслимых размеров, как правильно освобождать память?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2010, 09:43
Ответы с готовыми решениями:

Прозрачность формы, при наведении мыши на кнопку реализовать изменение её положения относительно формы с невозможностью выхода за границы формы
доброй ночи, уважаемые программисты, студенты,а также любители программировать. помогите, пожалуйста, написать программу на языке С++ ...

Динамическая память\формы
допустим создаю форму кодом вида (new newForm)->show(); при нажатии на "крестик" память будет освобождена?

Как при закрытии формы освободить память?
Пробовал так: procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin // Освобождаем память ...

5
 Аватар для Lelik-pahan
1708 / 904 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
19.12.2010, 19:11
визуальные компоненты удаляй не
C++
1
delete Fom1;
, а
C++
1
Form1->Free();
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
19.12.2010, 19:50
Lelik-pahan, ошибаетесь. Любой объект, созданный с помощью оператора new следует удалять с помощью оператора delete (выписка из MSDN).

Larsus, вы всё делаете правильно. У приложений, основанных на VCL (и не только) такая политика. Вы создали и отобразили объект, затем разрушили его. Пока есть свободная память, в использовании которой у ОС нет необходимости - она будет находится в распоряжении приложения.
Как только ОС запросит память - ей будет отдан необходимый освобождённый участок. Зачем нужен такой подход? Для того, чтобы тратить меньше времени на повторное воссоздание объекта.
Память не будет постоянно "утекать". Можете поэкспериментировать: создавать и удалять объект... где-то после 20-30 удаления размер ОЗУ, который вы наблюдаете в диспетчере задач, возрастать не будет.
0
 Аватар для Lelik-pahan
1708 / 904 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
19.12.2010, 20:23
MikeSoft, я знаю, что
Цитата Сообщение от MikeSoft Посмотреть сообщение
Любой объект, созданный с помощью оператора new следует удалять с помощью оператора delete
но мне объясняли, что это особенность билдера: если удалять визуальные объекты с помощью оператора delete, то остаются "хвосты" (не удаляются компоненты-наследники). И что метод Free() специально создан, чтобы решить эту проблему и корректно удалять объект и всё, что с ним связано.
Не знаю на сколько это правильно...
0
Эксперт С++
 Аватар для MikeSoft
3957 / 1812 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
19.12.2010, 20:47
Lelik-pahan, откройте справку к IDE и введите туда:
Code
1
Free, System.TObject
Содержимое должно быть примерно следующее:
Цитата Сообщение от RAD Studio XE Help
System.TObject.Free

Destroys an object and frees its associated memory, if necessary.

Use Free to destroy an object. Free automatically calls the destructor if the object reference is not nil. Any object instantiated at run time that does not have an owner should be destroyed by a call to Free, so that it can be properly disposed of and its memory released. Unlike Destroy, Free is successful even if the object is nil; if the object was never initialized, Free would not result in an error.

When you call Free for a component, it calls Free for all components that it owns—that is, all components in its component list. Since a form owns all the controls and other components that are created on it in design mode, those components are automatically freed when the form is freed. By default, all forms are owned by the Application object; when the application terminates, it frees the Application object, which frees all forms. For objects that are not components, or for components created with a nil owner, be sure to call Free after you are finished with them; otherwise the allocated memory will not be usable until after the application terminates.


Warning: Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, do not free a button or the form that owns the button in its OnClick event handler.
To free a form, call its _Release method, which destroys the form and releases the memory allocated for it after all its event handlers and those of the components it contains are through executing.

Note: In C++ code, do not use Free to destroy an object. Use the delete keyword.
Электронная версия доступна здесь: System.TObject.Free
2
 Аватар для Lelik-pahan
1708 / 904 / 207
Регистрация: 25.11.2009
Сообщений: 1,850
19.12.2010, 20:53
Спасибо,
MikeSoft,
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.12.2010, 20:53
Помогаю со студенческими работами здесь

Не освобождается память при закрытии дочерней формы
Суть в следующем: имеется главная форма и дочерняя (ShowDialog()) . При открытии дочерней формы происходит работа с базой данных и в...

Освободить оперативную память, после удаление формы
Помогите. Создаю форму так: Form1 notific = new Form1(); notific.Visible = true; Уничтожаю так: ...

Как освободить память после закрытия формы
Использую на событии OnClose данный код Action := caFree; Но мне нужно, чтобы можно было повторно открыть форму, стояло form1.show; но...

Сохранение данных с формы в постоянную память телефона
как мне сделать чтобы информацию с формы ui сохраняла не в оперативную память а просто в память телефона чтобы при закрытия приложения...

Написать программу преобразования инфиксной формы выражения в постфиксную (память)
Возникает проблема с использованием памяти. Не могу исправить. Точка останова срабатывает в функции removeAll #include...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru