Nasıl yapılır: Yerel Türlerde İşleyicileri Bildirme
Yerel türde tanıtıcı türü bildiremezsiniz. vcclr.h, C++ yığınından bir CLR nesnesine başvurmak için tür açısından güvenli sarmalayıcı şablonunu gcroot
sağlar. Bu şablon, bir sanal tanıtıcıyı yerel bir türe eklemenizi ve temel alınan tür gibi işlemenizi sağlar. Çoğu durumda, nesneyi herhangi bir atama olmadan katıştırılmış tür olarak kullanabilirsiniz gcroot
. Bununla birlikte , içindeki her birinde, temel alınan yönetilen başvuruyu almak için kullanmanız static_cast
gerekir.
Şablon gcroot
, atık toplanan yığına "tanıtıcılar" sağlayan System::Runtime::InteropServices::GCHandle değer sınıfının özellikleri kullanılarak uygulanır. Tanıtıcıların kendilerinin çöp toplanmadığını ve sınıftaki yıkıcı gcroot
tarafından artık kullanılmadığında serbest olduğunu unutmayın (bu yıkıcı el ile çağrılamaz). Yerel yığında bir gcroot
nesne örneği oluşturursanız, bu kaynakta delete öğesini çağırmanız gerekir.
Çalışma zamanı tanıtıcı ile başvurduğu CLR nesnesi arasında bir ilişki tutar. CLR nesnesi çöp toplanan yığınla birlikte hareket ettiğinde, tanıtıcı nesnenin yeni adresini döndürür. Bir değişkenin şablona gcroot
atanmadan önce sabitlenmiş olması gerekmez.
Örnekler
Bu örnek, yerel yığında bir nesnenin nasıl oluşturulacağını gcroot
gösterir.
// 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
Bu örnek, yerel yığında bir gcroot
nesnenin nasıl oluşturulacağını gösterir.
// 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
Bu örnek, kutulu türü kullanarak yerel bir türdeki gcroot
değer türlerine (başvuru türlerine değil) başvuruları tutmak için nasıl kullanılacağını gcroot
gösterir.
// 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