【问题标题】:GDI+ object leak (font, brush)GDI+ 对象泄漏(字体、画笔)
【发布时间】:2012-05-15 01:33:54
【问题描述】:

我在我的应用程序中遇到 GDI 字体和画笔泄漏。如何在我的源代码中找到已创建(和已处置)的对象?

我没有任何 toHFont 调用,并且所有对 Graphics 的访问都封装在 using 语句中。我从 GDIView 和 .NET Memory Profiler 等工具中知道它的画笔和字体 - 但他们没有说明在我的源代码中创建泄漏对象的位置。

我在 VS2008、.NET 3.5 中使用 C#。

【问题讨论】:

  • 代码审查怎么找不到。您肯定只在代码中的选定位置使用它们吗?否则,您将需要一个真正的 内存分析器来克服这个障碍,GDIView 和.NET MP 不符合那个标准。真实 = 金钱。
  • 我使用带有Graphics 的字体并将字体分配给控件。画笔仅用于Graphics。我也尝试重用它们,因为它们通常是静态变量,所以我不明白泄漏的点。
  • 静态变量是故意泄漏。它永远持有对画笔对象的引用。这样做没有任何意义,创建画笔对象非常便宜,只需要一微秒。
  • 为什么它会被一次又一次地使用而故意泄漏。只有大约 10 个变量,但 GDI 泄漏了数百种字体。

标签: .net gdi resource-leak


【解决方案1】:

一个好的做法是将字体和画笔包裹在 Using / End Using 块中。

【讨论】:

  • 当我一次又一次地使用一些画笔和字体时,我将它们放入静态变量中,以便减少创建它们的频率并更多地重复使用。所以我不能把它们放到 using-blocks 中(我尝试对每个实现 IDisposable 的资源做些什么)。
猜你喜欢
  • 2021-06-20
  • 2012-01-08
  • 2015-10-06
  • 1970-01-01
  • 2014-02-10
  • 2013-06-10
  • 2010-10-03
  • 2012-10-15
  • 1970-01-01
相关资源
最近更新 更多