Bagikan melalui


Cara: Menyimpan Referensi Objek dalam Memori Tidak Terkelola

Anda dapat menggunakan gcroot.h, yang membungkus GCHandle, untuk menyimpan referensi objek CLR dalam memori yang tidak dikelola. Atau, Anda dapat menggunakan GCHandle secara langsung.

Contoh

// hold_object_reference.cpp
// compile with: /clr
#include "gcroot.h"
using namespace System;

#pragma managed
class StringWrapper {

private:
   gcroot<String ^ > x;

public:
   StringWrapper() {
      String ^ str = gcnew String("ManagedString");
      x = str;
   }

   void PrintString() {
      String ^ targetStr = x;
      Console::WriteLine("StringWrapper::x == {0}", targetStr);
   }
};
#pragma unmanaged
int main() {
   StringWrapper s;
   s.PrintString();
}
StringWrapper::x == ManagedString

GCHandle memberi Anda sarana untuk menyimpan referensi objek terkelola dalam memori yang tidak dikelola. Anda menggunakan Alloc metode untuk membuat handel buram ke objek terkelola dan Free untuk melepaskannya. Selain itu, metode ini Target memungkinkan Anda untuk mendapatkan referensi objek kembali dari handel dalam kode terkelola.

// hold_object_reference_2.cpp
// compile with: /clr
using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed
class StringWrapper {
   IntPtr m_handle;
public:
   StringWrapper() {
      String ^ str = gcnew String("ManagedString");
      m_handle = static_cast<IntPtr>(GCHandle::Alloc(str));
   }
   ~StringWrapper() {
      static_cast<GCHandle>(m_handle).Free();
   }

   void PrintString() {
      String ^ targetStr = safe_cast< String ^ >(static_cast<GCHandle>(m_handle).Target);
      Console::WriteLine("StringWrapper::m_handle == {0}", targetStr);
   }
};

#pragma unmanaged
int main() {
   StringWrapper s;
   s.PrintString();
}
StringWrapper::m_handle == ManagedString

Lihat juga

Menggunakan interop C++ (PInvoke implisit)