唯一指针

在 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 编译器将 [唯一] 指针属性应用于非参数的所有指针。 可以使用 [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 例程处理的服务器的字符数据。