كيفية القيام بما يلي: التصريح بالمعالجات في الأنواع الأصلية
يتعذر تعريف نوع مؤشر في نوع أصلي. vcclr.h يوفر برنامج تضمين اﻷمن نوع قالب gcrootللإشارة إلى كائن CLR من الكومة C + +. يمكّنك هذا القالب من تضمين معالج ظاهري في نوع أصلي و يعامله كما لو كان النوع الأساسي . في معظم الحالات، يمكنك استخدام الكائن gcroot كنوع مضمن بدون أي تحويل. ومع ذلك، مع for each, in يلزمك استخدام static_cast لاسترداد المرجع الأساسي المدار.
يتم تطبيق القالب gcroot باستخدام التسهيلات من فئة القيمة System::Runtime::InteropServices::GCHandle التى توفر "المعالجات" لكومة الذاكرة المؤقتة الخاصة التى تعرضت لتجميع البيانات المهملة . لاحظ أنه لا يتم تجميع المعالجات نفسها كبيانات مهملة , و يتم تحريرها في حالة عدم استخدامها بواسطة المدمّر في الفئة gcroot (يتعذر استدعاء هذا المُدمر يدوياً ). في حالة إنشاء كائن gcroot فى كومة الذاكرة المؤقتة الأصلية، يجب عليك استدعاء حذف على ذلك المورد.
وقت التشغيل يحافظ على الارتباط بين المعالج و الكائن CLR الذى يشير إليه . عند نقل الكائن CLR مع الكومة المتعرضة لتجميع البيانات المهملة , سيُعيد المعالج العنوان الجديد للكائن. لا يجب على المتغير أن يتم تثبيته قبل أن يتم تعيينه للقالب gcroot.
مثال
يُظهر هذا النموذج كيفية إنشاء الكائن gcroot على المكدس الأصلي.
// mcpp_gcroot.cpp
// compile with: /clr
#include <vcclr.h>
using namespace System;
class CppClass {
public:
gcroot<String^> str; // can use str as if it were String^
CppClass() {}
};
int main() {
CppClass c;
c.str = gcnew String("hello");
Console::WriteLine( c.str ); // no cast required
}
hello
يُظهر هذا النموذج كيفية إنشاء gcroot الكائن على المكدس الأصلي.
// mcpp_gcroot_2.cpp
// compile with: /clr
// compile with: /clr
#include <vcclr.h>
using namespace System;
struct CppClass {
gcroot<String ^> * str;
CppClass() : str(new gcroot<String ^>) {}
~CppClass() { delete str; }
};
int main() {
CppClass c;
*c.str = gcnew String("hello");
Console::WriteLine( *c.str );
}
hello
يُظهر هذا النموذج كيفية استخدام gcroot لحمل مراجع لأنواع القيمة (لا أنواع المرجع) في نوع أصلي باستخدام gcroot على النوع فى المربع.
// mcpp_gcroot_3.cpp
// compile with: /clr
#include < vcclr.h >
using namespace System;
public value struct V {
String^ str;
};
class Native {
public:
gcroot< V^ > v_handle;
};
int main() {
Native native;
V v;
native.v_handle = v;
native.v_handle->str = "Hello";
Console::WriteLine("String in V: {0}", native.v_handle->str);
}
String in V: Hello