唯一指针
在 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 ,并指向调用后的有效字符串:
默认情况下,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 例程进行处理。