إدارة الذاكرة للمكونات. NET المستخدمة من قبل التعليمات البرمجية غير المدارة
-
08-07-2019 - |
سؤال
عند العمل في العالم غير المدارة، علينا أن نتأكد من أننا تنظيف بعد أنفسنا إذا خصصنا الذاكرة على كومة (على سبيل المثال باستخدام الكلمة new
في C ++)؛ علينا أيضا أن نتأكد من أننا AddRef
مكونات COM التي يتم إنشاؤها باستخدام CreateInstance
وRelease
في وقت لاحق. ربما شيء من هذا القبيل:
SomeNameSapce::IObjPtr obj;
HRESULT hr = obj.CreateInstance(L"SomeObject");
if (hr == S_OK)
{
obj->AddRef();
m_anotherObj= obj->GetObj();
obj->Release();
}
من الواضح أننا يمكن استخدام مؤشرات الذكية وغير ذلك من أمور أخرى (في C ++) ولكن هذا بالإضافة إلى نقطة ...
هل علينا أيضا أن AddRef/Release
للكائنات التي انتزع من مكونات COM (مثل m_anotherObj في المثال أعلاه)؟
لجعل الأمور أكثر مربكة، ماذا يحدث إذا كان هذا العنصر بالذات التي هي في الواقع مكون .NET الذي يتعرض له التعليمات البرمجية غير المدارة من خلال واجهة COM؟ هل جامع القمامة يعرف لمسح الاشياء أو يفعل كل شيء يتعين القيام به يدويا في العالم غير المدارة؟
المحلول
وCreateInstance
سوف اعطيكم ظهر كائن مع عدد مرجع 1، لذلك لا تحتاج إلى AddRef
ذلك. (المؤشر الذكي كنت قد استخدمت سوف Release
الكائن عندما يتم تدميره.) وبالمثل، كائنات تتلقاه أساليب يجب أن يكون عدد مرجع بمقدار بالفعل، لذلك لا تحتاج إلى AddRef
لهم مرة أخرى - ولكن كنت بحاجة إلى Release
لهم، إلا إذا كنت تستخدم مؤشر الذكية.
وCOM كشفها بواسطة صافي لا تختلف عن مكونات COM كتبه أي تكنولوجيا أخرى. وجامع القمامة لا تجمع أي كائنات. NET المشار إليه من مراجع COM.