утечка памяти в MDI с пустой дочерней формой - PullRequest
1 голос
/ 06 августа 2009

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

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

Если родительская форма не установлена, дочерняя форма удаляется.

Кто-нибудь знает, почему эту очевидную утечку памяти можно устранить?

Я использовал профилировщик памяти муравьев.

Боб.

Ответы [ 3 ]

1 голос
/ 06 августа 2009

Я думаю, что наиболее распространенным источником утечек памяти являются события, которые не высвобождаются должным образом, но вы сказали, что искали его.

Трудно точно определить, где находится утечка, не глядя на код. Я бы порекомендовал вам использовать .NET Memory Profiler . Я использовал его раньше, и, кажется, он превосходит муравьев.

1 голос
/ 04 мая 2010

Похоже, что это ошибка в .net framework 2.0, представленная с пакетом обновления 1 (SP1) и все еще присутствующая в пакете обновления 2 (SP2).

Просто прочитайте следующее сообщение в блоге, программное обеспечение SciTech, создатели .net Memory Profiler:
http://www.scitech.se/blog/index.php/2008/03/20/minor-memory-leak-introduced-in-net-framework-20-sp1/

Чтобы устранить проблему, добавьте следующий код в родительскую форму MDI:

protected override void OnMdiChildActivate(EventArgs e)
{
  // Code from http://www.scitech.se/blog/index.php/2008/03/20/minor-memory-leak-introduced-in-net-framework-20-sp1/
  base.OnMdiChildActivate(e);
  try
  {
    typeof(Form).InvokeMember("FormerlyActiveMdiChild",
    BindingFlags.Instance | BindingFlags.SetProperty |
    BindingFlags.NonPublic, null,
    this, new object[] { null });
  }
  catch (Exception)
  {
    // Something went wrong. Maybe we don't have enough
    // permissions to perform this or the
    // "FormerlyActiveMdiChild" property no longer
    // exists.
  }
}

Я проверил это с помощью ANTS Memory Profiler, и это исправило проблему в моем случае.

0 голосов
/ 06 августа 2009

Одна из возможностей - если вы подписаны на события объекта, он не будет собирать мусор. Вы должны убедиться, что ничто не ссылается на этот объект.

...