高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】gdi resource leak 9workaround0
gdi resource leak (workaround)
gdi resource leak (workaround)
we ran into a gdi resource leak connected to the use of savedc()/restoredc() in the gdi viewer implementation.
briefly, if the selected pen is not a stock object when restoredc() is called, the last reference to the pen is lost and the pen is leaked. this probably applies to brushes too, but we haven't had a problem with those.
the workaround we are using is to keep a list of all the pens that are created (deleting those which are succesfully deleted through deleteobject). after the drawing is done, we manually call deleteobject on all the remaining pens. we no longer see a resource leak (checking with microsoft's gdiusage.exe).
it would probably be cleaner to keep a handle to the most-recently-created pen in exgigdigeometry and explicitly delete that when creating and selecting a new pen. we didn't choose to modify the example code, because doing so interferes with cvs imports of new versions of dwgdirect.
perhaps you can send us some sample code.
quote:
originally posted by open design alliance
perhaps you can send us some sample code.
my sample code is for a viewer which is two steps removed from the dwgdirect code, so it would probably not be very useful to you. we use dwgdirect to draw the dwg onto an enhanced metafile; then we translate the emf to another metafile format; then we translate that format back to gdi calls.
i've attached a patch to exgigdigeometry.cpp that fixes the issue. after i rebuilt gs_wingdi.lib and relinked singledoc, i could no longer see a pen leak on my test drawing.
the relevant code:
code:
if(!m_clipstack.empty())
{
+ hpen hpen = (hpen)::getcurrentobject( m_htargetdc, obj_pen );
+ hbrush hbrush = (hbrush)::getcurrentobject( m_htargetdc, obj_brush );
+
::restoredc(m_htargetdc, m_clipstack.last());
+
+ ::selectobject( m_htargetdc, hpen );
+ ::selectobject( m_htargetdc, hbrush );
+
m_clipstack.removelast();
m_bbrushvalid = m_bpenvalid = false; // force recreate dc objects
}
else
attached files (1.2 kb, 13 views)
this has been fixed in version 1.13, with a tentative release date of the end of march, 2005.
|