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


Полные указатели

В отличие от уникальных указателей, полные указатели поддерживают псевдоним. Это означает, что несколько указателей могут ссылаться на одни и те же данные, как показано на следующем рисунке:

два указателя, ссылающиеся на одни и те же данные

Полный указатель имеет следующие характеристики:

  • Он может иметь значение NULL.
  • Он может измениться с null на ненулевое во время вызова. При изменении значения, отличного от NULL, заглушка клиента выделяет новую память, выделенную при возврате. Клиентская программа должна освободить эту память перед завершением работы.
  • Он может измениться с ненулевого на null во время вызова. При изменении значения null приложение отвечает за освобождение памяти.
  • Значение может измениться с одного ненулевого значения на другое.
  • Хранилище, к которому указывает полный указатель, может быть доступ к другому указателю или имени в операции.
  • Возвращаемые данные записываются в существующее хранилище, если указатель не имеет значения NULL.

Используйте атрибут [ptr] для указания полного указателя, как показано в следующем примере:

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(1.0)
]
interface FullPtrInterface
{
  void RemoteFn([in,ptr,string]) char *ptrName1,
                [in,ptr,string]  char *ptrName2);
}

В этом примере параметры ptrName1 и ptrName2 определяются как полные указатели на строку. Для обоих указателей можно указать один и тот же адрес памяти, содержащий одну строку.

[ptr] требуется при предоставлении поддержки псевдонима. Однако, так как для большинства приложений требуется большая обработка всех указателей, доступных в RPC, не рекомендуется.