Память не освобождается
От: agaman  
Дата: 05.01.04 06:45
Оценка:
Создаю дочернюю win форму. Добавляю на форму меню из одного пунткта и создаю событие на click:

this.mTest.Click += new System.EventHandler(this.mTest_Click);

private void mTest_Click(object sender, System.EventArgs e)
{
//Test
}

При создании и закрытии этой формы память не освобождается, даже если самому вызывать сбор мусора.

Теперь самое интересное, если в Dispose добавить такой код:

this.mTest.Click -= new System.EventHandler(this.mTest_Click);

То память освобождается.
Это ошибка в .NET или я что-то не так делаю?
Re: Память не освобождается
От: Igor Trofimov  
Дата: 05.01.04 08:26
Оценка:
Все верно, подписываясь на событие, ты создаешь делегат, ссылающийся на твою форму и отдаешь его на хранение источнику события.

Поэтому при сборке мусора твоя форма не умирает — на нее ссылается делегат.
Если умрт источник события — то умрет и форма.

Или отписывайся от событий.
Re[2]: Память не освобождается
От: agaman  
Дата: 05.01.04 09:30
Оценка:
iT>Поэтому при сборке мусора твоя форма не умирает — на нее ссылается делегат.
iT>Если умрт источник события — то умрет и форма.

А Кто в данном случае является источником события, и как его убить?
(По идее наверно меню, но оно должно само убиться при закрытии формы)

iT>Или отписывайся от событий.

А если этих событий много, значит все самому освобождать? Неправильно это как-то...
Re[3]: Память не освобождается
От: Igor Trofimov  
Дата: 05.01.04 09:47
Оценка:
A>А Кто в данном случае является источником события, и как его убить?
A>(По идее наверно меню, но оно должно само убиться при закрытии формы)

Ммм. не просек, что источник события у тебя — внутреннее меню... Невнимательный я. Думал, что событие — внешнее.

Ты это меню как — в дизайнере положил или сам создаешь?
Re[4]: Память не освобождается
От: agaman  
Дата: 05.01.04 11:53
Оценка:
iT>Ты это меню как — в дизайнере положил или сам создаешь?

В дизайнере. Штатными средствами, никаких трюков.
В том-то и дело что ошибка вроде-как очевидная, и возникнет в любом mdi приложении на .NET
Неужели никто на эти грабли не наступал?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.