Полные указатели
В отличие от уникальных указателей, полные указатели поддерживают псевдоним. Это означает, что несколько указателей могут ссылаться на одни и те же данные, как показано на следующем рисунке:
Полный указатель имеет следующие характеристики:
- Он может иметь значение 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, не рекомендуется.