Share via


pin_ptr (C++/CLI)

Mendeklarasikan penunjuk penyematan, yang hanya digunakan dengan runtime bahasa umum.

Semua Runtime

(Tidak ada keterangan untuk fitur bahasa ini yang berlaku untuk semua runtime.)

Windows Runtime

(Fitur bahasa ini tidak didukung di Windows Runtime.)

Runtime Bahasa Umum

Penunjuk penyematan adalah penunjuk interior yang mencegah objek menunjuk ke bergerak pada tumpukan yang dikumpulkan sampah. Artinya, nilai penunjuk penyematan tidak diubah oleh runtime bahasa umum. Ini diperlukan ketika Anda meneruskan alamat kelas terkelola ke fungsi yang tidak dikelola sehingga alamat tidak akan berubah secara tidak terduga selama resolusi panggilan fungsi yang tidak dikelola.

Sintaks

[cli::]pin_ptr<cv_qualifiertype>var = &initializer;

Parameter

cv_qualifier
const atau volatile kualifikasi. Secara default, penunjuk penyematan adalah volatile. Ini berlebihan tetapi bukan kesalahan untuk mendeklarasikan penunjuk volatilepenyematan .

jenis
Jenis penginisialisasi.

var
Nama variabel pin_ptr .

initializer
Anggota jenis referensi, elemen array terkelola, atau objek lain yang dapat Anda tetapkan ke pointer asli.

Keterangan

pin_ptr mewakili superset fungsionalitas pointer asli. Oleh karena itu, apa pun yang dapat ditetapkan ke pointer asli juga dapat ditetapkan ke pin_ptr. Penunjuk interior diizinkan untuk melakukan serangkaian operasi yang sama dengan pointer asli, termasuk perbandingan dan aritmatika pointer.

Objek atau sub-objek kelas terkelola dapat disematkan, dalam hal ini runtime bahasa umum tidak akan memindahkannya selama pengumpulan sampah. Penggunaan utama ini adalah untuk meneruskan penunjuk ke data terkelola sebagai parameter aktual dari panggilan fungsi yang tidak dikelola. Selama siklus koleksi, runtime akan memeriksa metadata yang dibuat untuk penunjuk penyematan dan tidak akan memindahkan item yang dituju.

Menyematkan objek juga menyematkan bidang nilainya; yaitu, bidang jenis primitif atau nilai. Namun, bidang yang dideklarasikan dengan handel pelacakan (%) tidak disematkan.

Menyematkan sub-objek yang ditentukan dalam objek terkelola memiliki efek menyematkan seluruh objek.

Jika penunjuk penyematan ditetapkan ulang untuk menunjuk ke nilai baru, instans sebelumnya yang diarahkan tidak lagi dianggap disematkan.

Objek disematkan hanya saat pin_ptr menunjuk ke objek tersebut. Objek tidak lagi disematkan ketika penunjuk penyematannya keluar dari cakupan, atau diatur ke nullptr. Setelah pin_ptr keluar dari cakupan, objek yang disematkan dapat dipindahkan di tumpukan oleh pengumpul sampah. Setiap pointer asli yang masih menunjuk ke objek tidak akan diperbarui, dan membatalkan referensi salah satunya dapat memunculkan pengecualian yang tidak dapat dipulihkan.

Jika tidak ada penunjuk penyematan yang menunjuk ke objek (semua penunjuk penyematan keluar dari cakupan, ditetapkan kembali untuk menunjuk ke objek lain, atau ditetapkan nullptr), objek dijamin tidak akan disematkan.

Penunjuk penyematan dapat menunjuk ke handel referensi, jenis nilai, atau gagang jenis kotak, anggota jenis terkelola, atau elemen array terkelola. Ini tidak dapat menunjuk ke jenis referensi.

Mengambil alamat pin_ptr yang menunjuk ke objek asli menyebabkan perilaku yang tidak terdefinisi.

Menyematkan pointer hanya dapat dinyatakan sebagai variabel lokal non-statis pada tumpukan.

Penyematan pointer tidak dapat digunakan sebagai:

  • parameter fungsi

  • jenis pengembalian fungsi

  • anggota kelas

  • jenis target dari cast.

pin_ptr ada di cli namespace layanan. Untuk informasi selengkapnya, lihat Namespace Platform, default, dan cli.

Untuk informasi selengkapnya tentang penunjuk interior, lihat interior_ptr (C++/CLI).

Untuk informasi selengkapnya tentang menyematkan pointer, lihat Cara: Menyematkan Pointer dan Array dan Cara: Mendeklarasikan Penunjuk Penyematan dan Jenis Nilai.

Persyaratan

Opsi pengkompilasi: /clr

Contoh

Contoh berikut menggunakan pin_ptr untuk membatasi posisi elemen pertama array.

// pin_ptr_1.cpp
// compile with: /clr
using namespace System;
#define SIZE 10

#pragma unmanaged
// native function that initializes an array
void native_function(int* p) {
   for(int i = 0 ; i < 10 ; i++)
    p[i] = i;
}
#pragma managed

public ref class A {
private:
   array<int>^ arr;   // CLR integer array

public:
   A() {
      arr = gcnew array<int>(SIZE);
   }

   void load() {
   pin_ptr<int> p = &arr[0];   // pin pointer to first element in arr
   int* np = p;   // pointer to the first element in arr
   native_function(np);   // pass pointer to native function
   }

   int sum() {
      int total = 0;
      for (int i = 0 ; i < SIZE ; i++)
         total += arr[i];
      return total;
   }
};

int main() {
   A^ a = gcnew A;
   a->load();   // initialize managed array using the native function
   Console::WriteLine(a->sum());
}
45

Contoh berikut menunjukkan bahwa penunjuk interior dapat dikonversi ke penunjuk penyematan, dan bahwa jenis pengembalian alamat operator (&) adalah penunjuk interior saat operand berada di timbunan terkelola.

// pin_ptr_2.cpp
// compile with: /clr
using namespace System;

ref struct G {
   G() : i(1) {}
   int i;
};

ref struct H {
   H() : j(2) {}
   int j;
};

int main() {
   G ^ g = gcnew G;   // g is a whole reference object pointer
   H ^ h = gcnew H;

   interior_ptr<int> l = &(g->i);   // l is interior pointer

   pin_ptr<int> k = &(h->j);   // k is a pinning interior pointer

   k = l;   // ok
   Console::WriteLine(*k);
};
1

Contoh berikut menunjukkan bahwa penunjuk penyematan dapat dilemparkan ke jenis lain.

// pin_ptr_3.cpp
// compile with: /clr
using namespace System;

ref class ManagedType {
public:
   int i;
};

int main() {
   ManagedType ^mt = gcnew ManagedType;
   pin_ptr<int> pt = &mt->i;
   *pt = 8;
   Console::WriteLine(mt->i);

   char *pc = ( char* ) pt;
   *pc = 255;
   Console::WriteLine(mt->i);
}
8
255