pin_ptr (C++/CLI)
Yalnızca ortak dil çalışma zamanıyla kullanılan sabitleme işaretçisini bildirir.
Tüm Çalışma Zamanları
(Bu dil özelliği için tüm çalışma zamanları için geçerli olan hiçbir açıklama yoktur.)
Windows Çalışma Zamanı
(Bu dil özelliği Windows Çalışma Zamanı desteklenmez.)
Ortak Dil Çalışma Zamanı
Sabitleme işaretçisi, işaret edilen nesnenin çöp toplanan yığın üzerinde hareket etmesini engelleyen bir iç işaretçidir. Yani, sabitleme işaretçisinin değeri ortak dil çalışma zamanı tarafından değiştirilmez. Yönetilmeyen işlev çağrısının çözümü sırasında adresin beklenmedik şekilde değişmemesi için yönetilen sınıfın adresini yönetilmeyen bir işleve geçirirken bu gereklidir.
Sözdizimi
[cli::]pin_ptr<cv_qualifiertype>var = &initializer;
Parametreler
cv_qualifier
const
veya volatile
niteleyiciler. Varsayılan olarak, sabitleme işaretçisi şeklindedir volatile
. Gereksizdir, ancak sabitleme işaretçisi volatile
bildirmek bir hata değildir.
type
Başlatıcının türü.
var
pin_ptr değişkeninin adı.
Başlatıcı
Bir başvuru türünün üyesi, yönetilen dizinin öğesi veya yerel işaretçiye atayabileceğiniz başka bir nesne.
Açıklamalar
pin_ptr, yerel işaretçinin işlevselliğinin üst kümesini temsil eder. Bu nedenle, yerel işaretçiye atanabilecek her şey bir pin_ptr de atanabilir. İç işaretçinin, karşılaştırma ve işaretçi aritmetiği de dahil olmak üzere yerel işaretçilerle aynı işlem kümesini gerçekleştirmesine izin verilir.
Yönetilen sınıfın bir nesnesi veya alt nesnesi sabitlenebilir; bu durumda ortak dil çalışma zamanı, atık toplama sırasında bunu taşımaz. Bunun asıl kullanımı, yönetilen verilere bir işaretçiyi yönetilmeyen işlev çağrısının gerçek parametresi olarak geçirmektir. Bir koleksiyon döngüsü sırasında çalışma zamanı sabitleme işaretçisi için oluşturulan meta verileri inceler ve işaret eden öğeyi taşımaz.
Nesneyi sabitlemek, değer alanlarını da sabitler; diğer bir ifadeyle, ilkel veya değer türünde alanlar. Ancak, izleme tutamacı (%
) tarafından bildirilen alanlar sabitlenmez.
Yönetilen nesnede tanımlanan bir alt nesneyi sabitlemek, nesnenin tamamını sabitlemenin etkisine sahiptir.
Sabitleme işaretçisi yeni bir değere işaret etmek için yeniden atanırsa, işaret edilen önceki örnek artık sabitlenmiş olarak kabul edilmez.
Nesne yalnızca bir pin_ptr onu işaret ederken sabitlenir. Nesne artık sabitleme işaretçisi kapsamın dışına çıktığında veya nullptr olarak ayarlandığında sabitlenmez. pin_ptr kapsam dışına çıktıktan sonra, sabitlenen nesne atık toplayıcı tarafından yığına taşınabilir. Nesneye işaret eden yerel işaretçiler güncelleştirilmez ve bunlardan birine başvurulmaması kurtarılamaz bir özel durum doğurabilir.
Nesneye işaret eden hiçbir sabitleme işaretçisi yoksa (tüm sabitleme işaretçileri kapsam dışında kaldıysa, diğer nesnelere işaret etmek için yeniden atandıysa veya nullptr olarak atandıysa), nesnenin sabitlenmemesi garanti edilir.
Sabitleme işaretçisi bir başvuru tutamacını, değer türünü veya kutulanmış tür tutamacını, yönetilen türün üyesini veya yönetilen dizinin bir öğesini işaret edebilir. Bir başvuru türüne işaret edemez.
Yerel bir nesneye işaret eden bir pin_ptr adresinin alınması tanımsız davranışa neden olur.
sabitleme işaretçileri yalnızca yığında statik olmayan yerel değişkenler olarak bildirilebilir.
sabitleme işaretçileri şu şekilde kullanılamaz:
işlev parametreleri
bir işlevin dönüş türü
bir sınıfın üyesi
bir atamanın hedef türü.
pin_ptr ad alanındadırcli
. Daha fazla bilgi için bkz . Platform, varsayılan ve cli Ad Alanları.
İç işaretçiler hakkında daha fazla bilgi için bkz . interior_ptr (C++/CLI).
İşaretçileri sabitleme hakkında daha fazla bilgi için bkz . Nasıl yapılır: İşaretçileri ve Dizileri Sabitleme ve Nasıl Yapılır: Sabitleme İşaretçileri ve Değer Türlerini Bildirme.
Gereksinimler
Derleyici seçeneği: /clr
Örnekler
Aşağıdaki örnek, bir dizinin ilk öğesinin konumunu kısıtlamak için pin_ptr kullanır.
// 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
Aşağıdaki örnek, bir iç işaretçinin sabitleme işaretçisine dönüştürülebileceğini ve işlenen yönetilen yığında olduğunda işleç adresinin (&
) dönüş türünün bir iç işaretçi olduğunu gösterir.
// 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
Aşağıdaki örnekte sabitleme işaretçisinin başka bir türe atanabileceği gösterilmektedir.
// 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