3

DerefOutptr SAL 注释有什么区别?此外,您何时使用不同类型的Outptr注释,如 _Outptr_result_buffer_all_ 和 _Outptr_result_buffer_?

4

1 回答 1

4

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. 缓冲区的大小在 中找到*_PBufferSizeInBytes

于 2015-02-23T14:51:03.737 回答