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