إدارة الذاكرة للمكونات. NET المستخدمة من قبل التعليمات البرمجية غير المدارة

StackOverflow https://stackoverflow.com/questions/298397

سؤال

عند العمل في العالم غير المدارة، علينا أن نتأكد من أننا تنظيف بعد أنفسنا إذا خصصنا الذاكرة على كومة (على سبيل المثال باستخدام الكلمة 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.

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