__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