pin_ptr (C++/CLI)
宣告固定指標,而僅與使用 common language runtime。
所有的執行階段
(還有沒有此語言功能的註解適用於所有的執行階段)。
Windows 執行階段
(此語言功能不支援 Windows 執行階段中)。
Common Language Runtime
A 固定指標會使該物件的內部指標指到在記憶體回收堆積上移動。也就是 common language runtime 不會變更 pin 指標的值。當您傳遞的 managed 類別的地址至 unmanaged 函式,讓地址不會意外地 unmanaged 函式呼叫的解析過程時,這是必要的。
語法
[cli::]pin_ptr<cv_qualifier type> var = &initializer;
參數
cv_qualifier
const或volatile的限定詞。根據預設,pin 指標是volatile。它是多餘但不是宣告 pin 指標錯誤volatile。type
initializer 的型別。var
值為pin_ptr變數。初始設定式
成員的參考型別、 managed 的陣列或任何其他物件,您可以為原生指標指定的項目。
備註
A pin_ptr代表的原生指標的功能超集。因此,任何項目可以指派給原生指標也可以指派給pin_ptr。內部指標便會允許執行相同的作業集合稱為原生指標,包括比較和指標算術。
物件或子物件的 managed 類別可以被 pin,並在此情況下 common language runtime 不會移動它在記憶體回收期間。主體的用法是將指示傳遞至受管理的資料為實際 unmanaged 函式呼叫的參數。集合循環中,執行階段將會檢查建立 pin 指標的中繼資料,並不會移動它指向的項目。
固定物件也會固定其值的欄位。 亦即,鍵入欄位的基本項目或值。不過,欄位宣告追蹤控制代碼 (%) 並未固定。
固定在受管理的物件中定義的子物件具有固定整個物件的效果。
如果 pin 指標以指向新的值加以分派,所指到前一個執行個體不再被視為固定。
物件經過 pin 處理之後才雖然pin_ptr它所指向的點。物件不再 pin 變數時超出範圍,其 pin 的指標,或被設定成 nullptr。後pin_ptr可以記憶體回收行程堆積中移動超出範圍,已釘選的物件。將不會更新任何仍然指向物件的原生指標,並 de-referencing 其中一人可能會引發例外狀況無法復原。
當任何 pinning 指標不指到物件 (pinning 的所有指標超出領域、 已重新指派給指向其他物件,或已指派給 nullptr),不保證物件固定。
Pin 指標可以指向的控制代碼的參考、 實值型別或 boxed 型別控制代碼、 的 managed 型別,成員或 managed 陣列的元素。它無法指向參考型別。
位址pin_ptr點,以原生的物件會導致未定義的行為。
Pinning 指標在堆疊上只能宣告為非靜態區域變數。
Pinning 指標不能當做:
函式參數
函式的傳回型別
類別成員
型別轉換目標型別。
pin_ptr在cli命名空間。如需詳細資訊,請參閱 Platform、default 和 cli 命名空間 (C++ 元件擴充功能)。
如需有關內部指標的詳細資訊,請參閱interior_ptr (C++/CLI)。
如需有關固定指標的詳細資訊,請參閱HOW TO:固定指標和陣列和HOW TO:宣告固定的指標和實值型別。
需求
編譯器選項:/clr
範例
範例
下列範例會使用pin_ptr ,限制陣列中的第一個元素的位置。
// 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());
}
Output
範例
下列範例會顯示內部指標可以轉換成 pin 的指標和傳回型別,傳址運算子 (&) 是內部指標,當運算元是在 managed 堆積上。
// 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);
};
Output
範例
下列範例會示範 pin 的指標可以轉型為另一個型別。
// 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);
}
Output