Поделиться через


pin_ptr (C++/CLI)

Объявляет закрепляющий указатель, который используется только со средой CLR.

AfxWndProc

(Нет примечания для данной функции языка, которые применяются ко всем средам выполнения).

Колесо

(Эта функция языка не поддерживается в окнах среды выполнения).

Среда CLR

Закрепляющий указатель на внутренний указатель, который предотвращает указанный объект в результате переходить мусор-собранная куча.То есть значение закрепляющего указателя не изменяется средой CLR.Это необходимо при передаче адреса управляемого класса в неуправляемую функцию, так как адрес не изменится неожиданно во время разрешения вызова неуправляемой функции.

1dz8byfh.collapse_all(ru-ru,VS.110).gifСинтаксис

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

1dz8byfh.collapse_all(ru-ru,VS.110).gifПараметры

  • cv_qualifier
    const или квалификаторы volatile.По умолчанию закрепляющий указатель volatile.Инструкция backup, но не ошибки для объявления закрепляющий указатель volatile.

  • тип
    Тип initializer.

  • var
    Имя переменной pin_ptr.

  • инициализатор
    Элемент ссылочного типа элемента управляемого массива или любого другого объекта, который можно присвоить собственный указатель.

1dz8byfh.collapse_all(ru-ru,VS.110).gifЗаметки

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).

Дополнительные сведения о закрепление указателей см. в разделе Практическое руководство. Закрепление указателей и массивов и Практическое руководство. Объявление закрепляющих указателей и типов значений.

1dz8byfh.collapse_all(ru-ru,VS.110).gifТребования

Параметр компилятора: /clr

1dz8byfh.collapse_all(ru-ru,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_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