唯一指针

在 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 ,并指向调用后的有效字符串:

指针在 null 值和非 null 值之间更改

默认情况下,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 例程进行处理。