> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XMemSetWin32HeapTrackingHooks

> XMemSetWin32HeapTrackingHooks

# XMemSetWin32HeapTrackingHooks

设置用于 Win32 堆的内存分配、重新分配和释放的跟踪回调函数。

<a id="syntaxSection" />

## 语法

```cpp theme={null}
VOID XMemSetWin32HeapTrackingHooks(  
         PHEAP_TRACK_ALLOC_ROUTINE AllocRoutine,  
         PHEAP_TRACK_REALLOC_ROUTINE ReAllocRoutine,  
         PHEAP_TRACK_FREE_ROUTINE FreeRoutine  
)  
```

<a id="parametersSection" />

### 参数

*AllocRoutine*   \_In\_\
类型：[PHEAP\_TRACK\_ALLOC\_ROUTINE](/reference/system/xmem/functions/pheap_track_alloc_routine)

指向内存分配跟踪回调函数的指针。

*ReAllocRoutine*   \_In\_\
类型：[PHEAP\_TRACK\_REALLOC\_ROUTINE](/reference/system/xmem/functions/pheap_track_realloc_routine)

指向内存重新分配跟踪回调函数的指针。

*FreeRoutine*   \_In\_\
类型：[PHEAP\_TRACK\_FREE\_ROUTINE](/reference/system/xmem/functions/pheap_track_free_routine)

指向内存释放跟踪回调函数的指针。

<a id="retvalSection" />

### 返回值

类型：VOID

无。

<a id="remarksSection" />

## 备注

此函数允许你通过指定在这些堆内存操作被调用时由 GDK 内存管理器调用的回调函数，来跟踪 Win32 堆的内存分配、重新分配和释放。有关跟踪内存操作的详细信息，请参阅[诊断和内存跟踪](/build/console-features/memory/system-memory-diagnostics)。

<Note>CRT 在与 CRT 链接的 DLL/EXE 的初始化和入口点期间会进行多次堆分配。由于该初始化是这些模块中任何代码执行的先决条件，因此通常无法在*所有*堆分配发生之前调用 XMemSetWin32HeapTrackingHooks。回调代码应了解此行为并进行相应处理。</Note>

在调用此函数之前，必须首先实现以下相应的跟踪回调函数：

* 若要在调用 `HeapAlloc` 时跟踪分配，请实现 [PHEAP\_TRACK\_ALLOC\_ROUTINE 回调](/reference/system/xmem/functions/pheap_track_alloc_routine)函数。
* 若要在调用 `HeapReAlloc` 时跟踪重新分配，请实现 [PHEAP\_TRACK\_REALLOC\_ROUTINE 回调](/reference/system/xmem/functions/pheap_track_realloc_routine)函数。
* 若要在调用 `HeapFree` 时跟踪释放，请实现 [PHEAP\_TRACK\_FREE\_ROUTINE 回调](/reference/system/xmem/functions/pheap_track_free_routine)函数。

你只需实现跟踪需求所需的那些跟踪回调函数。若要停止跟踪堆内存操作，请调用此函数并为你希望停止跟踪的相应堆内存操作指定 `NULL`。

下面的示例定义了跟踪回调函数，然后使用 `XMemSetWin32HeapTrackingHooks` 函数设置和清除指向这些跟踪回调函数的挂钩。

```cpp theme={null}
void OnHeapAlloc(HANDLE hHeap, DWORD flags, SIZE_T size, PVOID addr)
{
    DebugPrint("[Heap 0x%p] Alloc %I64d bytes at addr: %p\n",
               hHeap, size, addr);
}

void OnHeapRealloc(HANDLE hHeap, DWORD flags, SIZE_T size, PVOID oldAddr, PVOID newAddr)
{
    DebugPrint("[Heap 0x%p] ReAlloc addr: 0x%p to %I64d bytes (new addr: 0x%p)\n",
               hHeap, oldAddr, size, newAddr);
}

void OnHeapFree(HANDLE hHeap, DWORD flags, PVOID addr)
{
    DebugPrint("[Heap 0x%p] Free addr: 0x%p\n",
               hHeap, addr);
}

// Set Hooks
XMemSetWin32HeapTrackingHooks(OnHeapAlloc, OnHeapReAlloc, OnHeapFree);

// Clear Hooks
XMemSetWin32HeapTrackingHooks(NULL, NULL, NULL);
```

<a id="requirementsSection" />

## 要求

**头文件：** xmem.h

**库：** xmem.lib

**支持的平台：** XBOX One 系列主机和 XBOX Series 主机

<a id="seealsoSection" />

## 另请参阅

[内存](/build/console-features/memory/system-memory-overview)\
[XMem](/reference/system/xmem/xmem_members)


## Related topics

- [PHEAP_TRACK_ALLOC_ROUTINE callback](/zh-CN/reference/system/xmem/functions/pheap_track_alloc_routine.md)
- [PHEAP_TRACK_FREE_ROUTINE callback](/zh-CN/reference/system/xmem/functions/pheap_track_free_routine.md)
- [PHEAP_TRACK_REALLOC_ROUTINE callback](/zh-CN/reference/system/xmem/functions/pheap_track_realloc_routine.md)
- [xCurl 概述](/zh-CN/build/console-features/networking/web-requests/intro-xcurl.md)
- [XMemSetOption](/zh-CN/reference/system/xmem/functions/xmemsetoption.md)
