Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查询HeapSetInformation()win 32 api_C++_Winapi - Fatal编程技术网

C++ 查询HeapSetInformation()win 32 api

C++ 查询HeapSetInformation()win 32 api,c++,winapi,C++,Winapi,在经历了这个过程之后,我无法理解使用这个api的目的 我正在代码中使用下面的调用 ULONG heapInfo = 2 ; HeapSetInformation( GetProcessHeap(),HeapCompatibilityInformation,&heapInfo, sizeof( heapInfo ) ) 根据secondarg,上面的链接说:启用堆特性。仅支持低碎片堆(LFH)。但是,应用程序不必启用LFH,因为系统根据需要使用LFH来服务内存分配请求 我的问题: 1)

在经历了这个过程之后,我无法理解使用这个api的目的

我正在代码中使用下面的调用

ULONG heapInfo = 2 ;
HeapSetInformation( GetProcessHeap(),HeapCompatibilityInformation,&heapInfo,  sizeof( heapInfo ) )
根据secondarg,上面的链接说:启用堆特性。仅支持低碎片堆(LFH)。但是,应用程序不必启用LFH,因为系统根据需要使用LFH来服务内存分配请求

我的问题: 1)
您能否帮助我理解此api
HeapSetInformation
()的含义以及此api中第二个参数(
HeapCompatibilityInformation
)的用途?我无法理解LFH在这里的含义。

这些是MS平台上提供的非常低级的内存管理API。您不应该尝试使用这些API,除非它是绝对必要的,我们完全理解这一点

现在,关于你的问题:

此api HeapSetInformation()的含义是什么

这将启用指定堆的功能。现在,每个进程都保持堆段的数量。其中一个称为默认堆段GetProcessHeap()API返回该默认堆段的句柄。该特性将由该API的第二个参数决定

此API中第二个参数(HeapCompatibilityInformation)的用途

这决定了可以将功能的类型设置为特定堆段。目前支持两种功能:

  • HEAP兼容性信息
  • 可处罚的终止腐败
您可以从链接中阅读有关这些的详细信息。是系统将应用于进程堆段的策略。然而,MSDN文档清楚地提到,系统将处理这些内容,因此 我们不应该试图自行设置/更改这些属性

但是,应用程序不需要启用LFH 因为系统根据需要使用LFH来服务内存分配 请求

如果您真的想详细了解这些内容,请阅读经典书籍《高级Windows调试,作者:作者:Mario Hewardt;Daniel Pravat》第06章。这几乎涵盖了关于系统如何管理堆段的所有内容,以及在基于Windows的系统上管理的各种其他低级别概念


API设置堆的属性。第二个属性标识要设置的属性

您正在讨论的属性是是否使用低碎片堆。在Vista和更高版本上,仅此而已,因此该属性没有影响。在XP上,此属性可用于请求低碎片堆


这里描述了低碎片堆:

machien环境是windows 2003,20082008是vista的服务器版本。所以只有lfh在那里。2003年是XP的时间框架。因此,这种设置会产生影响。如文档中所述。