GDI+库Gdiplus::Pen类GetBrush()方法造成应用程序内存猛增

Windows GDI+库中Pen类有个函数GetBrush(),可以通过Pen类方便的生成Brush类对象。

按照MSDN中的代码

  VOID Example_GetBrush(HDC hdc)
  {
     Graphics graphics(hdc);
     HatchBrush hatchBrush(
        HatchStyleVertical, 
        Color(255, 255, 0, 0),   // red
        Color(255, 0, 0, 255));  // blue
     // Create a pen based on a hatch brush, and use that pen
     // to draw a line.
     Pen pen(&hatchBrush, 15);
     graphics.DrawLine(&pen, 0, 0, 200, 100);
     // Get the pen's brush, and use that brush to fill a rectangle.
     Brush* pBrush = pen.GetBrush();
     graphics.FillRectangle(pBrush, 0, 100, 200, 100);
  }

似乎GetBrush()返回的Brush对象不需要手动删除.

在实际运用中(代码逻辑结构如下),发现对同一pen对象多次调用GetBrush()方法获得的指针不同,即对应多个Brush。

Gdiplus::Pen* lpPen = ::new Gdiplus::Pen(Gdiplus::Color(argb),width);
for(int i = 0; i < 1000; i++)
{ 
    ... 
    Brush* lpBrush = lpPen->GetBrush();
    ... 
} 
delete lpPen;

即使pen对象已经被释放,但是这部分空间还未被释放,造成应用程序消耗内存越来越多。

也许由于GDI+库的内存独立管理,或者在应用程序关闭时,库会释放所有创建的Brush对象。在应用程序使用MFC自带的内存检查未发现内存泄露现象,从任务管理器中看到内存的使用量逐步升高。

因此在实际使用中将上述结构的代码改成,如下结构:

Gdiplus::Pen* lpPen = ::new Gdiplus::Pen(Gdiplus::Color(argb),width);
for(int i = 0; i < 1000; i++)
{ 
    ... 
    Brush* lpBrush = lpPen->GetBrush();
    ... 
    delete lpBrush;
    ... 
} 
delete lpPen;


转载于:https://my.oschina.net/SKII/blog/638501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值