C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Очистка памяти от динамических форми, Как очистить память от ненкжной формы?
VilgelmKaizer
Отправлено: 02.10.2006, 10:41


Дежурный стрелочник

Группа: Участник
Сообщений: 38



Привет всем!
У меня такой вопрос: есть ли функция которая выгружает из памяти форму и все ее компоненты. Или нужно уничтожать каждый обьект формы по отдельности? Я знаю что обьекты создаются динамически.
Функция Free() не помогает — нужно что-то более кардинальное.
Пример: форма создана динамически, при ее закрытии она должна быль уничтожена и память д.б. очищена незамедлительно(так чтобы в диспетчере задач было видно что память очистилась).
AVC
Отправлено: 02.10.2006, 11:06


Ветеран

Группа: Модератор
Сообщений: 1583



TSomeForm *frm = new TSomeForm(Application);
frm->ShowModal();
delete frm;
VilgelmKaizer
Отправлено: 02.10.2006, 11:36


Дежурный стрелочник

Группа: Участник
Сообщений: 38



В этом случае уничтожается только форма, а ее компоненты остаются в памяти. Есть ли способ типа Aplication->Terminate(); — но только для одной формы. Чтобы не надо было писать delete — для всех компонентов.

И еще вопрос: Куда лучше засунуть delete Form
- в OnClose();
- или в OnDestroy();
VilgelmKaizer
Отправлено: 02.10.2006, 11:56


Дежурный стрелочник

Группа: Участник
Сообщений: 38



Да, попробовал создал 2 формы
1 — главная, 2 — создается динамически.
Создаем из 1 формы вторую

TForm2* Form2 = new TForm2(Application);
Form2->Show();

из первой формы выполняем
delete Form2;
или
Form2->Free();
или
Form2->~TForm2();

Ничего не помогает форма Form2 — так и остается как нив чем ни бывало.

Если прописаль delete в OnShow() формы Form2 и закрыть ее(нажать Х) — форма исчезает но память не освобождается.
Что делать -то?
AVC
Отправлено: 02.10.2006, 12:58


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (VilgelmKaizer @ 02.10.2006, 10:36)
В этом случае уничтожается только форма, а ее компоненты остаются в памяти.

Заблуждаетесь. За удаление компонентов, принадлежащих форме отвечает сама форма иесли они правильно созданы, то беспокоится об их удалении нечего.

QUOTE

И еще вопрос: Куда лучше засунуть delete Form
- в OnClose();
- или в OnDestroy();

Это смотря чего, но точно не в саму форму. Для формы у Close есть специальный параметр. Если поставить caFree то delete вызывать не нужно. Этот вариант удобно применять если форма показана методом Show, т.е когда наступление момента ненужнсти формы заранее не известен.

PS. А еще похоже вы путаете свободную память системы и пул памяти для приложения. После delete освобождаемая память может далеко не сразу быть отдана системе (а то и никогда).

PPS. Поищите на этом форуме по слову caFree — должно помочь.
VilgelmKaizer
Отправлено: 02.10.2006, 13:29


Дежурный стрелочник

Группа: Участник
Сообщений: 38



Обьеткы созданы правильно, т.е. это стандартные обьекты из палитры компонентов.
Если не возвращать освободившуюся память в систему то приложение может слишком разростить.
Как вернуть память в систему сразу после закрытия формы?
AVC
Отправлено: 02.10.2006, 14:22


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (VilgelmKaizer @ 02.10.2006, 12:29)
Как вернуть память в систему сразу после закрытия формы?

Ни как. И вообще это "головная боль" системы.
Возможно нужно перепланировать приложение.
А что, вы действительно создаете формы которые реально могут забить 2 гига памяти?
Shagg
Отправлено: 02.10.2006, 14:23


Дежурный стрелочник

Группа: Участник
Сообщений: 69



передать для создаваемых компонент Owner — создаваемую форму. Тогда при разрушении формы будут разрушены и компоненты.
VilgelmKaizer
Отправлено: 02.10.2006, 17:42


Дежурный стрелочник

Группа: Участник
Сообщений: 38



Что совсем никак нельзя принудительно вернуть освобожденную память в систему? Если конечно не сезть в дебри низкоуровневого прогр-я?
Приложение работает с базаой данных, которая понятно дело лежит на сервере. Принцип такой — есть родительская форма, которая явл-ся просто менюшкой а из нее вызываются дочерние окна в которых реализованы запросы к базе. одно и тоже окно можно открывать несколько раз.
А когда все закрываешь получается что что висит одно материнское окошко а памяти сожрано 40 Мб, а изначально было около 7-8 Мб.
Admin
Отправлено: 02.10.2006, 17:59


Владимир

Группа: Администратор
Сообщений: 1190



Может попробовать поискать утечку в чем то другом ?
(если она есть, эта утечка).

Например в создаваемой/удаляемой форме Вы как-то динамически
выделяете память (через new или каким то объектам, типа векторам) ?
Тогда может помочь при удалении формы предварительное
освобождение этой памяти.
AVC
Отправлено: 03.10.2006, 10:37


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Что совсем никак нельзя принудительно вернуть освобожденную память в систему?

Ни как.
Ну сами подумайте. Например (примитивно) мы выделили блоки памяти A, B и C потом освободили B — что отдавать системе? Без реорганизации памяти и всем, что это за собой влечет (например указатели) область которую занимал сегмент B системе не отдашь, а вот повторно использовать можно.
Arsa
Отправлено: 03.10.2006, 23:27


Дежурный стрелочник

Группа: Участник
Сообщений: 77



Я не уверен поможет ли, но попробуй создавать формы в отдельном классе, а потом убивай класс. Сам не пробовал, но как -нибудь поробую.

УДАЧИ!
AVC
Отправлено: 04.10.2006, 10:58


Ветеран

Группа: Модератор
Сообщений: 1583



Инетресная идея.
QUOTE

попробуй создавать формы в отдельном классе

Т.е
class TForm1 : public TForm
это еще не класс?

QUOTE

а потом убивай класс

а это как?
olegenty
Отправлено: 04.10.2006, 11:03


Ветеран

Группа: Модератор
Сообщений: 2412



auto_ptr в этом случае очень рулит

Вернуться в Вопросы программирования в C++Builder