سؤال

ولقد لاحظت استخدام مدير المهام التي التعليمة البرمجية التالية لديه تسرب GDI في ذلك. عدد من وجوه GDI في عملية تنفيذ هذا الرمز يزيد بنسبة 1 في كل مرة ينفذ ولكن أنا لا يمكن أن يبدو للعثور على المشكلة.

وسيكون موضع تقدير أي مساعدة.

// create new DC based on current    
HDC hDC = CreateCompatibleDC(GetDC());
// select a bitmap into the new DC and keep the old one
HGDIOBJ hOldObj = SelectObject (hDC,hBM);
// do somthing here --> 100% no leak here
SomeFunction (hDC);
// select the old object back from whence it came and delete whats returned   
DeleteObject (SelectObject (hDC,hOldObj));
// delete the DC
DeleteDC(hDC);
// delete the tmp object
DeleteObject (hOldObj);

وRM

هل كانت مفيدة؟

المحلول

ونسخ من التعليق، وأنا لم يضع أنها الجواب وأنا لا يمكن اختبار ذلك، وأنا لم يكن متأكدا مما إذا كان صحيحا، يرجى اختباره.

في عام أنها ليست فكرة جيدة أن تداخل المكالمات، أي

HDC hDC1 = GetDC(); 
HDC hDC2 = CreateCompatibleDC(hDC1); 
.. 

وبدلا من

HDC hDC = CreateCompatibleDC(GetDC()); 

و(BTW في التعليمات البرمجية الخاصة بك HDC إرجاعها بواسطة GetDC لا يتم تحرير).

نصائح أخرى

تأكد من أنه يمكنك استدعاء ReleaseDC لا DeleteDC على مقابض عاد من GetDC.

ويمكن أن أنصح deleaker لإيجاد وإصلاح التسربات.

و(كنت على وشك أن أقول هذا عندما لاحظت أن هناك بالفعل تعليق مع الإجابة - الفضل في ذلك إلى xhantt)

وأنا لا أعتقد أن يتم تحرير العاصمة التي أنشأتها GetDC () على السطر الأول.

وأعتقد الإجابة على هذا السؤال بالفعل. أريد أن تقفز في ويوصي مختلف الطبقات مؤشر الذكية ومغلفة المتوفرة للكائنات GDI.

وMFC لديه العديد من الأشياء GDI ذات الصلة مثل CDC وCMemoryDC وهلم جرا. انها سوف تؤدي الحذف الصحيح عندما لم تعد مطلوبة.

وقراءة بيتزولد. GetDC () هو في الحقيقة القاعدة.

ويجب أن لا يكون حذف hOldObj على السطر الأخير

وDeleteObject (hOldObj)؛

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top