共用方式為


pin_ptr (C++/CLI)

宣告固定指標,而僅與使用 common language runtime。

所有的執行階段

(還有沒有此語言功能的註解適用於所有的執行階段)。

Windows 執行階段

(此語言功能不支援 Windows 執行階段中)。

Common Language Runtime

A 固定指標會使該物件的內部指標指到在記憶體回收堆積上移動。 也就是 common language runtime 不會變更 pin 指標的值。 當您傳遞的 managed 類別的地址至 unmanaged 函式,讓地址不會意外地 unmanaged 函式呼叫的解析過程時,這是必要的。

1dz8byfh.collapse_all(zh-tw,VS.110).gif語法

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

1dz8byfh.collapse_all(zh-tw,VS.110).gif參數

  • cv_qualifier
    const或volatile的限定詞。 根據預設,pin 指標是volatile。 它是多餘但不是宣告 pin 指標錯誤volatile。

  • type
    initializer 的型別。

  • var
    值為pin_ptr變數。

  • 初始設定式
    成員的參考型別、 managed 的陣列或任何其他物件,您可以為原生指標指定的項目。

1dz8byfh.collapse_all(zh-tw,VS.110).gif備註

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:宣告固定的指標和實值型別

1dz8byfh.collapse_all(zh-tw,VS.110).gif需求

編譯器選項:/clr

1dz8byfh.collapse_all(zh-tw,VS.110).gif範例

範例

下列範例會使用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