Deref 和 Outptr SAL注释之间有什么区别? 你何时使用不同类型的 Outptr 注释,如_Outptr_result_buffer_all_和_Outptr_result_buffer _?
答案 0 :(得分:3)
SAL的记录很少。您需要查看sal.h
文件。
Deref和Outptr SAL注释之间有什么区别
它们是相同的,除了 Deref 注释来自SAL 1而 Outptr 来自SAL 2(可以表达更多)。所以 Deref 已被弃用。
此外,您何时使用不同类型的Outptr注释,如_Outptr_result_buffer_all_和_Outptr_result_buffer _?
从sal.h引用:
Outptr :返回的变量是指针类型(因此param是指向指针的类型)。被叫功能提供/分配空间。
查看来源,_Outptr_result_buffer_
和_Outptr_result_buffer_all_
几乎相同。您提供将要分配的元素数作为参数(如果它只是一个元素,请使用_Outptr_
)。区别在于前者意味着元素可由调用者写入(隐式地它们也是可读的),而后者意味着元素只能读取。
查看C运行时源,仅在极少数地方使用_Outptr_result_buffer_
,例如。对于在_dupenv_s
中创建的缓冲区:
_Check_return_opt_ _CRTIMP errno_t __cdecl _dupenv_s(
Outptr_result_buffer_maybenull_(*_PBufferSizeInBytes) _Outptr_result_z_ char **_PBuffer,
_Out_opt_ size_t * _PBufferSizeInBytes,
_In_z_ const char * _VarName);
因此,此函数在_PBuffer
中创建一个(以null结尾的)缓冲区。缓冲区的大小可在*_PBufferSizeInBytes
中找到。