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