pin_ptr (C++/CLI)
Объявляет закрепляющий указатель, который используется только со средой CLR.
AfxWndProc
(Нет примечания для данной функции языка, которые применяются ко всем средам выполнения).
Колесо
(Эта функция языка не поддерживается в окнах среды выполнения).
Среда CLR
Закрепляющий указатель на внутренний указатель, который предотвращает указанный объект в результате переходить мусор-собранная куча.То есть значение закрепляющего указателя не изменяется средой CLR.Это необходимо при передаче адреса управляемого класса в неуправляемую функцию, так как адрес не изменится неожиданно во время разрешения вызова неуправляемой функции.
Синтаксис
[cli::]pin_ptr<cv_qualifier type> var = &initializer;
Параметры
cv_qualifier
const или квалификаторы volatile.По умолчанию закрепляющий указатель volatile.Инструкция backup, но не ошибки для объявления закрепляющий указатель volatile.тип
Тип initializer.var
Имя переменной pin_ptr.инициализатор
Элемент ссылочного типа элемента управляемого массива или любого другого объекта, который можно присвоить собственный указатель.
Заметки
pin_ptr представляет надмножество функциональных возможностей собственного указателя.Таким образом, любые конструкции, которое может быть присвоено собственный указатель можно также присвоить pin_ptr.Внутренний указатель разрешено выполнять один и тот же набор операций, как собственные указатели, включая сравнения и арифметические операции указателя.
Объект или вложенный объект управляемого класса можно закрепить. в этом случае среда CLR не перемещает его во время сборки мусора.В основном для использования этого передать указатель к управляемым данным в качестве фактического параметра вызова неуправляемой функции.Во время цикла коллекции, среда выполнения проверяет, созданные метаданные для закрепляющего указателя и не перемещает элемент оно указывает.
Закрепящ закрепления объекта также его полей значений; то есть поля примитива или типа значения.Однако поля, объявленные с помощью отслеживания дескриптор (%) не размещаются.
Закрепление вложенный объект, указанный в управляемом объекте действует закрепить объект целого.
Если переподчинен закрепляющий указатель к пункту к новому значению, указанному на предыдущий экземпляр больше не считается закреплено.
Закрепляется объект только во время pin_ptr указывает на него.Объект более не закреплен при его закрепляющий указатель выходит из области или имеет значение nullptr.После pin_ptr выходит из области, объект, который закреплен могут быть перемещены в куче сборщиком мусора.Не будут обновлены все собственные указателей, указывающих на объект и de-снабжающ на один из них может вызвать неустранимая исключение.
Если нет гарантии, что точка не закреплен закрепляющий указателей на объект (всем указателям закрепляющего пошли из области были переподчинены к точке на другие объекты или присвоенны nullptr) объект.
Закрепляющий указатель может указывать на маркер ссылки, тип значения или положенному упакован в маркер управляемого типа, члену типа или элемента управляемого массива.Он не может указывать на ссылочному типу.
Предполагая, что адрес 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