CWin32Heap 类
此类使用 Win32 堆分配函数实现 IAtlMemMgr。
重要
无法在 Windows 运行时中执行的应用程序中使用此类及其成员。
语法
class CWin32Heap : public IAtlMemMgr
成员
公共构造函数
名称 | 描述 |
---|---|
CWin32Heap::CWin32Heap | 构造函数。 |
CWin32Heap::~CWin32Heap | 析构函数。 |
公共方法
名称 | 描述 |
---|---|
CWin32Heap::Allocate | 从堆对象中分配内存块。 |
CWin32Heap::Attach | 将堆对象附加到现有堆。 |
CWin32Heap::Detach | 将堆对象与现有堆分离。 |
CWin32Heap::Free | 释放之前从堆中分配的内存。 |
CWin32Heap::GetSize | 返回从堆中分配的内存块的大小。 |
CWin32Heap::Reallocate | 从堆对象中重新分配内存块。 |
公共数据成员
“属性” | 描述 |
---|---|
CWin32Heap::m_bOwnHeap | 用于确定堆句柄当前所有权的标志。 |
CWin32Heap::m_hHeap | 堆对象的句柄。 |
备注
CWin32Heap
使用 Win32 堆分配函数(包括 HeapAlloc 和 HeapFree)实现内存分配方法。 与其他堆类不同,CWin32Heap
在分配内存之前需要提供有效的堆句柄:其他类默认使用进程堆。 可以为构造函数或 CWin32Heap::Attach 方法提供该句柄。 有关详细信息,请参阅 CWin32Heap::CWin32Heap 方法。
示例
请参阅 IAtlMemMgr 的示例。
继承层次结构
IAtlMemMgr
CWin32Heap
要求
标头:atlmem.h
CWin32Heap::Allocate
从堆对象中分配内存块。
virtual __declspec(allocator) void* Allocate(size_t nBytes) throw();
参数
nBytes
新内存块中请求的字节数。
返回值
将指针返回到新分配的内存块。
备注
调用 CWin32Heap::Free 或 CWin32Heap::Reallocate 来释放此方法分配的内存。
使用 HeapAlloc 实现。
CWin32Heap::Attach
将堆对象附加到现有堆。
void Attach(HANDLE hHeap, bool bTakeOwnership) throw();
参数
hHeap
一个现有的堆句柄。
bTakeOwnership
一个指示 CWin32Heap
对象是否要接管堆资源的所有权的标志。
备注
如果 bTakeOwnership 为 TRUE,则 CWin32Heap
对象负责删除堆句柄。
CWin32Heap::CWin32Heap
构造函数。
CWin32Heap() throw();
CWin32Heap( HANDLE hHeap) throw();
CWin32Heap(
DWORD dwFlags,
size_t nInitialSize,
size_t nMaxSize = 0);
参数
hHeap
一个现有的堆对象。
dwFlags
在创建堆时使用的标志。
nInitialSize
堆的初始大小。
nMaxSize
堆的最大大小。
注解
在分配内存之前,必须为 CWin32Heap
对象提供有效的堆句柄。 实现此目的的最简单的方法是使用进程堆:
CWin32Heap MyHeap(GetProcessHeap());
也可以向构造函数提供现有堆句柄,在这种情况下,新对象不会接管此堆的所有权。 在删除 CWin32Heap
对象时,原始堆句柄仍将有效。
还可使用 CWin32Heap::Attach 将现有堆还附加到新对象。
如果在单个线程中执行所有操作时需要堆,则最佳方法是创建如下对象:
CWin32Heap MyHeap(HEAP_NO_SERIALIZE, SomeInitialSize);
参数 HEAP_NO_SERIALIZE 指定在堆函数分配和释放内存时不会使用互斥,从而使性能得到相应的提升。
第三个参数默认为 0,这使堆能够根据需要增长。 有关内存大小和标志的说明,请参阅 HeapCreate。
CWin32Heap::~CWin32Heap
析构函数。
~CWin32Heap() throw();
注解
如果 CWin32Heap
对象拥有堆的所有权,则销毁堆句柄。
CWin32Heap::Detach
将堆对象与现有堆分离。
HANDLE Detach() throw();
返回值
返回之前附加对象的堆的句柄。
CWin32Heap::Free
释放以前由 CWin32Heap::Allocate 或 CWin32Heap::Reallocate 从堆分配的内存。
virtual void Free(void* p) throw();
参数
p
指向要重新释放的内存块的指针。 NULL 是有效值,不执行任何操作。
CWin32Heap::GetSize
返回从堆中分配的内存块的大小。
virtual size_t GetSize(void* p) throw();
参数
p
指向该方法将获取其大小的内存块的指针。 这是 CWin32Heap::Allocate 或 CWin32Heap::Reallocate 返回的指针。
返回值
返回分配的内存块的大小(以字节为单位)。
CWin32Heap::m_bOwnHeap
用于确定存储在 m_hHeap 中的堆句柄当前所有权的标志。
bool m_bOwnHeap;
CWin32Heap::m_hHeap
堆对象的句柄。
HANDLE m_hHeap;
注解
用于存储堆对象的句柄的变量。
CWin32Heap::Reallocate
从堆对象中重新分配内存块。
virtual __declspec(allocator) void* Reallocate(void* p, size_t nBytes) throw();
参数
p
指向要重新分配的内存块的指针。
nBytes
已分配块的新大小(以字节为单位)。 块可放大或缩小。
返回值
将指针返回到新分配的内存块。
备注
如果 p 为 NULL,则假定尚未分配内存块,并且使用 nBytes 自变量调用了 CWin32Heap::Allocate。
另请参阅
类概述
IAtlMemMgr 类
CLocalHeap 类
CGlobalHeap 类
CCRTHeap 类
CComHeap 类
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈