Страница 1 из 1

Form.Close or Dispose в C++.NET (managed code)

Добавлено: 28 июл 2004, 21:40
vg
Как правлильно в конкретном примере, что ниже? MSDN читал. Не бейте.
На форме frm1 : public System::Windows::Forms::Form две кнопочки - "Exit" и "Show frm2".
Когда нажимешь на кнопоку для формы frm1:

Код: Выделить всё

	private: System::Void btnExit_Click(System::Object *  sender, System::EventArgs *  e)
			 {
				 Close();
			 }
Здесь по Close() нет вопросов. Вопрос дальше....
Когда нажимаешь на кнопочку формы frm1 Show frm2", показываем вторую модальную форму frm2 : public System::Windows::Forms::Form:

Код: Выделить всё

	private: System::Void btnShow_Click(System::Object *  sender, System::EventArgs *  e)
			 {
				 Arms::frm2 *frm = new frm2;
				 frm->ShowDialog();
				 frm->Close();
				 //frm->_Dispose();

			 }
_Dispose только вызывает протектед метод Dispose(true); формы frm2.

Как правлильно frm->Close(); или frm->_Dispose();???
Прикол (для unmanaged programmer-а) в том, что для вызова frm->Close() фактически вызов Dispose этой формы происходит только при завершении работы всего приложения. Другими словами, 100 раз "запускаем" модальную форму, но Dispose этой формы не будет вызвана ни разу. Только при завершении работы всего приложения Dispose будет вызвана 100 раз.

Если делать frm->_Dispose();, то Dispose модальной формы будет вызвана 200 раз:
- 100 раз после создания и закрытия формы:

Код: Выделить всё

	private: System::Void btnShow_Click(System::Object *  sender, System::EventArgs *  e)
			 {
				 Arms::frmLS2 *frm = new frmLS2;
				 frm->ShowDialog();
				 frm->_Dispose();

			 }
- 100 раз, как и в случае frm->Close();

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

Добавлено: 29 июл 2004, 07:54
папа Карло
я точно не помню..... вроде надо делать клоз, после диспоз, а потом еще указателю нал присвоить.... если чего, ногами не бить, я не программер :roll:

Добавлено: 29 июл 2004, 14:20
vg
я точно не помню..... вроде надо делать клоз, после диспоз, а потом еще указателю нал присвоить.... если чего, ногами не бить, я не программер
Спасибо, Папа, за мнение. B C++.NET (для managed) немного не так. "Достаточно" клоуз или только диспоуз. Кстати, в шарпе, думаю, тоже. По поводу указателя... В С++ (managed or unmanaged, как для .НЕТ, так и .ДА) это не обязательно. Присвоение указателю NULL не освобождает ранее выделенные ресурсы. Это только работает в нормальных языках, например, в VB :lol: Хотя речь там идёт, конечно, не об указателях, как таковых, в явном виде.

Добавлено: 16 авг 2004, 15:20
vg
Вот ещё всплыло в обсуждениях того, как работает НЕТ фраймворк с классами гарбидж колекшн... Получается, что НЕТ для __gc классов сам подчищает за программером вне зависимости от того, освобождал программер ресурсы или нет. Это как-то не очень логично, т.к. возможно я захочу освобождать ресурсы "по ходу пьесы". Баг здесь может быть связан с тем, на сколько надёжно сделана уборка мусора в НЕТ. В том числе динамическая (до завершения работы всего приложения), когда уже ресурсов не хватает.