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 в этом случае очень рулит
|
|