Cara: Mendeklarasikan Handel dalam Jenis Asli
Anda tidak dapat mendeklarasikan tipe handel dalam tipe asli. vcclr.h menyediakan templat gcroot
pembungkus jenis aman untuk merujuk ke objek CLR dari timbunan C++. Templat ini memungkinkan Anda menyematkan handel virtual dalam jenis asli dan memperlakukannya seolah-olah itu adalah jenis yang mendasar. Dalam kebanyakan kasus, Anda dapat menggunakan gcroot
objek sebagai jenis tersemat tanpa transmisi apa pun. Namun, dengan untuk masing-masing, di, Anda harus menggunakan static_cast
untuk mengambil referensi terkelola yang mendasar.
gcroot
Templat diimplementasikan menggunakan fasilitas kelas nilai System::Runtime::InteropServices::GCHandle, yang menyediakan "handles" ke dalam tumpukan yang dikumpulkan sampah. Perhatikan bahwa handel itu sendiri bukan sampah yang dikumpulkan dan dibebaskan ketika tidak lagi digunakan oleh destruktor di gcroot
kelas (destruktor ini tidak dapat dipanggil secara manual). Jika Anda membuat gcroot
instans objek pada tumpukan asli, Anda harus memanggil hapus pada sumber daya tersebut.
Runtime akan mempertahankan hubungan antara handel dan objek CLR, yang dirujuknya. Ketika objek CLR bergerak dengan tumpukan yang dikumpulkan sampah, handel akan mengembalikan alamat baru objek. Variabel tidak harus disematkan sebelum ditetapkan ke gcroot
templat.
Contoh
Sampel ini menunjukkan cara membuat gcroot
objek pada tumpukan asli.
// 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
Sampel ini menunjukkan cara membuat gcroot
objek pada timbunan asli.
// 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
Sampel ini menunjukkan cara menggunakan gcroot
untuk menyimpan referensi ke jenis nilai (bukan jenis referensi) dalam jenis asli dengan menggunakan gcroot
pada jenis kotak.
// 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
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk