唯一指针

在 C 程序中,多个指针可以包含数据的地址。 指针据说为数据创建 别名 。 当指针指向声明的变量时,也会创建别名。 以下代码片段说明了这两种别名方法:

int iAnInteger=50;

// The next statement makes ipAnIntegerPointer an
// alias for iAnInteger.
int *ipAnIntegerPointer = &iAnInteger;

// This statement creates an alias for ipAnIntegerPointer.
int *ipAnotherIntegerPointer = ipAnIntegerPointer;

在典型的 C 程序中,可以使用以下定义指定二进制树:

typedef struct _treetype 
{
    long               lValue;
    struct _treetype * left;
    struct _treetype * right;
} TREETYPE;

TREETYPE * troot;

多个指针可以访问树节点的内容。 对于未分发的应用程序,这通常很正常。 但是,这种编程样式会生成更复杂的 RPC 支持代码。 客户端和服务器存根需要额外的代码来管理数据和指针。 基础存根代码必须解析指向地址的各种指针,并确定数据副本代表最新版本。

如果保证指针是应用程序访问内存区域的唯一方式,则可以减少处理量。 指针仍可以具有 C 指针的许多功能。 例如,它可以在 null 和非 null 值之间更改,或保持不变。 下面的示例对此进行了演示。 该指针在调用前为 null ,在调用后指向有效的字符串:

pointer changing between null and non-null values

默认情况下,MIDL 编译器将 [ unique] 指针属性应用于非参数的所有指针。 可以使用 [ pointer_default] 属性更改此默认设置。

唯一指针具有以下特征:

  • 它可以具有 null 值。
  • 它可以在调用期间从 null 更改为非 null 。 当值更改为非 null 时,将在返回时分配新的内存。
  • 它可以在调用期间从非 null 更改为 null 。 当值更改为 NULL 时,应用程序负责释放内存。
  • 该值可以从一个非 null 值更改为另一个值。
  • 操作中任何其他指针或名称都无法访问唯一指针指向的存储。
  • 如果指针没有 null 值,则返回数据将写入现有存储中。

以下示例演示如何定义唯一指针。

/* IDL file */
[ 
  uuid(ba209999-0c6c-11d2-97cf-00c04f8eea45),
  version(1.0)
]
interface RefPtrInterface
{
  void RemoteFn([in, unique] char *ach);
}

在此示例中,参数 ach 是一个唯一的指针,指向发送到要使用 RemoteFn 例程处理的服务器的字符数据。