pin_ptr(C++/CLI)
선언 된 고정 포인터, 공용 언어 런타임만을 사용 합니다.
모든 런타임
(모든 런타임에 적용 없음이 언어 기능에 대 한 설명입니다.)
Windows 런타임
(이 언어 기능은 Windows 런타임에서 지원 되지 않습니다.)
공용 언어 런타임
A 고정 포인터 개체를 방지 하는 내부 포인터는 가비지 수집 된 힙에 이동에서 가리키는입니다.즉, 고정 포인터의 값은 공용 언어 런타임에 의해 변경 되지 않습니다.주소가 관리 되지 않는 함수 호출을 확인 하는 동안 예기치 않게 변경 되지 않습니다 있도록 하는 관리 되지 않는 함수에 관리 되는 클래스의 주소를 전달 하는 경우입니다.
구문
[cli::]pin_ptr<cv_qualifier type> var = &initializer;
매개 변수
cv_qualifier
const또는 volatile 한정자입니다.기본적으로, 고정 포인터는 volatile.고정 포인터를 선언 하는 오류가 아니라 있지만 중복 된 volatile.type
initializer의 형식입니다.var
이름에 pin_ptr 변수입니다.이니셜라이저
참조 형식, 요소는 관리 되는 배열 또는 네이티브 포인터를 할당할 수 있는 기타 모든 개체의 구성원입니다.
설명
A pin_ptr 는 네이티브 포인터의 기능 집합을 나타냅니다.따라서 아무것도에 대 한 원시 포인터를 할당할 수 있습니다 또한 할당 될 수 있는 pin_ptr.내부 포인터 포인터 산술 비교를 포함 한 네이티브 포인터와 동일한 일련의 작업이 수행할 수 있습니다.
개체 또는 관리 되는 클래스의 하위 개체를 경우에 공용 언어 런타임에서 가비지 수집 중 이동 하지 않습니다 고정할 수 있습니다.이 보안 주체를 사용 하려면 관리 되는 데이터 포인터를 관리 되지 않는 함수 호출의 실제 매개 변수로 전달 것입니다.수집 주기, 런타임은 만든 고정 포인터에 대 한 메타 데이터를 검사 하 고이 가리키는 항목을 이동 합니다.
개체를 고정 값 필드 핀이 있습니다. 즉, 필드의 기본 형식 또는 값을 입력 합니다.그러나 필드를 선언 핸들을 추적 하 여 (%) 고정 되지 않습니다.
고정 하 여 관리 되는 개체의 정의 하위 개체의 전체 개체를 고정 하는 것과 같습니다.
고정 포인터를 새 값으로 가리키도록 다시 할당할 경우 이전 인스턴스를 가리키는 것으로 더 이상 간주 고정 합니다.
고정 됩니다만 하는 동안에 pin_ptr 를 가리킵니다.고정 된 포인터로 범위를 벗어났습니다 또는 설정 된 경우 개체는 더 이상 고정 되어 nullptr.다음은 pin_ptr 범위에서 고정 된 개체를 이동할 수 있습니다 이동할 힙에서 가비지 수집기에 의해.여전히 개체를 가리키는 포인터를 네이티브 업데이트 되지 않습니다, 및 그 중 하나는 de-referencing 복구할 수 없는 예외가 발생할 수 있습니다.
고정 포인터 없음 개체를 가리키는 경우 (모든 고정 포인터 범위를 벗어나면 오류가 발생 했는지, 다른 개체를 가리키도록 다시 할당 된 또는 할당 된 nullptr), 개체를 고정할 수 없습니다 보장 됩니다.
고정 포인터는 참조 핸들, 값 형식 또는 boxed 형식 핸들, 관리 되는 형식의 멤버 또는 관리 되는 배열의 요소를 가리킬 수 있습니다.이 참조 형식으로 가리킬 수 없습니다.
주소는 pin_ptr 포인트는 네이티브 개체에 정의 되지 않은 동작이 발생 합니다.
고정 포인터는 스택에서 비정적 지역 변수로 선언할 수 있습니다.
고정 포인터는 사용할 수 없습니다.
함수 매개 변수
함수의 반환 형식
클래스의 멤버
대상 형식 캐스트입니다.
pin_ptr되는 cli 네임 스페이스입니다.자세한 내용은 Platform, default 및 cli 네임스페이스(C++ 구성 요소 확장)를 참조하십시오.
내부 포인터에 대 한 자세한 내용은 interior_ptr(C++/CLI).
고정 포인터에 대 한 자세한 내용은 방법: 포인터 및 배열 고정 및 방법: 고정 포인터 및 값 형식 선언.
요구 사항
컴파일러 옵션:/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_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_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