Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Динамическое создание форм и дальнейшее освобождение ресурсов.

590
14 февраля 2008 года
Gigahard
223 / / 03.04.2006
Есть некий класс формы. Создается динамически.
Задача: очистить выделенную память после закрытия формы. Как оказалось, по закрытию форма не вызывает своего деструктора.
Собственно как корректно заставить форму освобождать память при закрытии?
Первой идеей было поместить в обработчик события OnClose, следующую строчку:
 
Код:
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
      delete this;
}


Но не вызовет ли этот код конфликтных ситуаций? Ведь по сути получится, что выход из функции класса TForm2::FormClose() произойдет уже после того, как сам класс будет уничтожен.

Собственно два вопроса: корректен ли такой способ удаления объекта формы? Если нет, то как это правильно делать?
11
14 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Gigahard
Есть некий класс формы. Создается динамически.
Задача: очистить выделенную память после закрытия формы. Как оказалось, по закрытию форма не вызывает своего деструктора.
Собственно как корректно заставить форму освобождать память при закрытии?
Первой идеей было поместить в обработчик события OnClose, следующую строчку:
 
Код:
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
      delete this;
}


Но не вызовет ли этот код конфликтных ситуаций? Ведь по сути получится, что выход из функции класса TForm2::FormClose() произойдет уже после того, как сам класс будет уничтожен.

Собственно два вопроса: корректен ли такой способ удаления объекта формы? Если нет, то как это правильно делать?



как форма отображается? (модально али нет)
если модально то

 
Код:
Form->ShowModal();
delete Form;

иначе удалять принудительно когда она больше не нужна в классе, который ее создал и вызвал (можно при помощи некоего флага)
т.е.
 
Код:
if (!flag) delete Form;
489
14 февраля 2008 года
NeO_u
277 / / 11.10.2006
Сделай деструктор формы:-)
~TForm2();
а вообще, Form2->Free() - освобобождает и так память.
вот пример динамического создания:
 
Код:
TForm *Form = new TForm2(this);
Form->ShowModal();
Form->Free();
11
14 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: NeO_u
Сделай деструктор формы:-)
~TForm2();
а вообще, Form2->Free() - освобобождает и так память.
вот пример динамического создания:
 
Код:
TForm *Form = new TForm2(this);
Form->ShowModal();
Form->Free();



а что деструктор формы делает? (я всегда думал что он атоматом вызывается при уничтожении объекта)
как его сюда приваять не вижу возможностей (разве только lkz удаления дочерних объектов)
метод Free() - это паскалевская конструкция, в С++ не прокатит, для этого есть delete

489
14 февраля 2008 года
NeO_u
277 / / 11.10.2006
Цитата: oxotnik333
а что деструктор формы делает? (я всегда думал что он атоматом вызывается при уничтожении объекта)
как его сюда приваять не вижу возможностей (разве только lkz удаления дочерних объектов)
метод Free() - это паскалевская конструкция, в С++ не прокатит, для этого есть delete



На счет деструктора, да, я ошибся.

delete - тоже прокатит. Но, если мне не изменяет память, Free() - не просто уничтожает объект, в отличии от delete.

11
14 февраля 2008 года
oxotnik333
2.9K / / 03.08.2007
Цитата: NeO_u
На счет деструктора, да, я ошибся.

delete - тоже прокатит. Но, если мне не изменяет память, Free() - не просто уничтожает объект, в отличии от delete.



цитата прямо из хелпа:
[quote=BCB Help]
Do not call the Free method of an object. Instead, use the delete keyword, which invokes Free to destroy an object. Free automatically calls the destructor if the object reference is not NULL.
[/quote]

1
14 февраля 2008 года
kot_
7.3K / / 20.01.2000
Цитата: Gigahard
Есть некий класс формы. Создается динамически.
Задача: очистить выделенную память после закрытия формы. Как оказалось, по закрытию форма не вызывает своего деструктора.
Собственно как корректно заставить форму освобождать память при закрытии?
Первой идеей было поместить в обработчик события OnClose, следующую строчку:

 
Код:
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
      delete this;
}


Но не вызовет ли этот код конфликтных ситуаций? Ведь по сути получится, что выход из функции класса TForm2::FormClose() произойдет уже после того, как сам класс будет уничтожен.

Собственно два вопроса: корректен ли такой способ удаления объекта формы? Если нет, то как это правильно делать?


Нет не корректен. Подобный вызов делита однозначно приведет к проблемам.
Парвильно
Правильно:

 
Код:
void __fastcall TForm2::FormClose(TObject *Sender, TCloseAction &Action)
{
      Action = caFree;
}
1
14 февраля 2008 года
kot_
7.3K / / 20.01.2000
2oxotnik333,NeO_u
Читайте пожайлуйста вопрос - прежде чем что либо советовать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог