为什么 MS 安全示例似乎在文档中为一个函数使用一个内存分配例程,而在另一个函数中使用另一个?
我找到了一个示例,他们在示例代码的不同点实际使用了不同的示例。见GetAppContainerNamedObjectPath
功能。
这HeapAlloc
在分配 SID 和LocalAlloc
分配安全描述符时都使用。在示例结束之前,两个分配都被释放了,为什么它们使用不同的方法?我见过人们::malloc
在博客示例中使用。
为什么 MS 安全示例似乎在文档中为一个函数使用一个内存分配例程,而在另一个函数中使用另一个?
我找到了一个示例,他们在示例代码的不同点实际使用了不同的示例。见GetAppContainerNamedObjectPath
功能。
这HeapAlloc
在分配 SID 和LocalAlloc
分配安全描述符时都使用。在示例结束之前,两个分配都被释放了,为什么它们使用不同的方法?我见过人们::malloc
在博客示例中使用。
LocalAlloc
HeapAlloc
在这种情况下是相同的。情况并非总是如此,但至少十年来一直如此。我知道,这很令人困惑,但这都是传统 16 位系统和向后兼容性的结果。请参阅此文档:
Windows 内存管理不像 16 位 > Windows 那样提供单独的本地堆和全局堆。因此,全局函数族和局部函数族是等价的,在它们之间进行选择是个人喜好问题。
另请参阅此文档:
从私有堆分配的内存和使用其他内存分配函数分配的内存没有区别。有关函数的完整列表,请参阅内存管理函数中的表格。
存在差异,因此请务必阅读记忆功能的文档。例如,CoTaskMemFree
处理 NULL 但HeapFree
不处理。不同的分配函数将使您对如何在 OS 对象(进程等)之间分配和共享内存进行不同程度的控制。但是,如果您只想为您的进程提供一些普通的旧内存,请始终检查您正在使用的 API 的文档,因为它可能指定您应该使用特定的分配或释放函数,否则,只需选择一个并保持一致。
至于为什么文档会切换它?我的猜测是,随着时间的推移,它被不止一个人入侵,其中没有一个是真正的操作系统团队成员。MSDN 示例代码是出了名的糟糕。您应该有一种方法可以标记它或在 MSDN 页面上留下反馈。
MS安全示例不使用malloc,因为根据我的说法,malloc函数的缺点是运行时依赖,HeapAlloc(使用RtlReAllocateHeap)不会为0大小的指针分配内存,其中malloc加上LocalAlloc比HeapAlloc有更大的开销,但小于malloc。