共用方式為


__pin

附註本主題僅適用於第 1 版的 Managed Extensions for C++。 這個語法只應該用於維護第 1 版的程式碼。 請參閱pin_ptr如有關在新語法中使用的相等功能。

避免在記憶體回收期間移動 common language runtime 的物件或內嵌的 managed 類別的物件。

__pin identifier

備註

__pin關鍵字宣告物件或內嵌的物件的 managed 類別的指標,並防止 common language runtime 會在記憶體回收期間移動該物件。 在傳遞至 unmanaged 函式的 managed 類別的位址,因為 unmanaged 函式呼叫的解析過程的位址會意外地變更時,這非常有用。

Pin 指標會在它的語彙範圍中保持有效。 Pin 指標超出範圍,當物件不再被視為釘選 (除非不用多說,有其他 pinning 的指標,指向或物件)。

MSIL 會並沒有 「 區塊範圍 」 的概念--所有區域變數習慣都生活在函式的範圍。 若只要讓系統知道固定已不再有效,編譯器會產生程式碼,將 NULL 指派給 pin 的指標。 這也是您可以做什麼,如果您要移除而不需要離開該區塊的物件。

不應該將您的 pin 指標轉換為不受管理的指標後, 繼續使用這個 unmanaged 的指標物件不再 pin 變數 (在 pin 的指標超出範圍)。 不像 gc 指標固定指標可以轉換成 nogc,不受管理的指標。 不過,是要維持固定,而不受管理的指標正在使用中的使用者的責任。

取得變數位址使用 pin 的指標,然後使用該地址 pin 指標超出範圍後,不應該在執行。

// keyword_pin_scope_bad.cpp
// compile with: /clr:oldSyntax /LD
#using <mscorlib.dll>
__gc struct X {
   int x;
};
 
int* Get_x( X* pX ) {
   int __pin* px = &pX -> x;
   return px;   // BE CAREFUL px goes of scope, 
                // so object pointed by it is no longer pinned,
                // making the return value unsafe.
}

下列範例會顯示正確的行為:

// keyword_pin_scope_good.cpp
// compile with: /clr:oldSyntax /LD
#using <mscorlib.dll>
__gc struct X {
   int x;
};
 
int Get_x( X* pX ) {
   int __pin* px = &pX -> x;
   return *px;   // OK, value obtained from px before px out of scope
}

範例

在下列範例中,指向物件pG已釘選,直到它超出範圍:

// keyword__pin.cpp
// compile with: /clr:oldSyntax
#using <mscorlib.dll>
#include <iostream>

__gc class G { 
public: 
   int i; 
   G() {i = 0;};
};

class H {
public:
   // unmanaged function
   void incr(int * i) {
      (*i)++; 
      std::cout << *i << std::endl;
   };
};

int main() {
   G __pin * pG = new G;  // pG is a pinning pointer
   H * h = new H;
   // pointer to managed data passed as actual parameter of unmanaged 
   // function call
   h->incr(& pG -> i); 
}

Output

1