1、默认堆
- 当进程初始化时,系统在进程的地址空间中创建一个堆。该堆称为进程的默认堆。按照默认设置,该堆的地址空间区域的大小是1 MB。但是,系统可以扩大进程的默认堆,使它大于其默认值。当创建应用程序时,可以使用/ H E A P链接开关,改变堆的1 M B默认区域大小。由于D L L没有与其相关的堆,所以当链接D L L时,不应该使用/ H E A P链接开关。
- 由于进程的默认堆栈可供许多Windows函数使用,你的应用程序有许多线程同时调用各种Windows函数,因此对默认堆栈的访问是顺序进行的。
- 你无法告诉Windows函数不要使用默认堆栈。
2、辅助堆
由于下列原因,你可能想要在自己的应用程序中创建一些辅助堆:
- 保护组件
- 更加有效地进行内存管理
- 进行局部访问
- 减少线程同步的开销
- 迅速释放堆
3、创建/撤销辅助堆
创建辅助堆: HANDLE HeapCreate(DWORD fdwOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize);
撤销辅助堆: BOOL HeapDestroy(HANDLE hHeap);
4、从对中分配/释放内存块
从堆栈中分配内存块: PVOID HeapAlloc(HANDLE hHeap, DWORD fdwFlags, SIZE_T dwBytes);
改变内存块的大小: PVOID HeapReAlloc( HANDLE hHeap, DWORD fdwFlags, PVOID pvMem, SIZE_T dwBytes);
检索内存块的实际大小: SIZE_T HeapSize( HANDLE hHeap, DWORD fdwFlags, LPCVOID pvMem);
释放内存块: BOOL HeapFree( HANDLE hHeap, DWORD fdwFlags, PVOID pvMem);
5、用C++程序来使用堆
class
CSomeClass 
...
{
private:
static HANDLE s_hHeap;
static UINT s_uNumAllocsInHeap;
// Other private data and member functions
...
public:
void* operator new (size_t size);
void operator delete (void* p);
// Other public data and member functions
...
}
;
/**/
//////////////////////////////////////////////////
HANDLE CSomeClass::s_hHeap
=
NULL;
UINT CSomeClass::s_uNumAllocsInHeap
=
0
;
void
*
CSomeClass::
operator
new
(size_t size)
...
{
if(s_hHeap == NULL)
...{
// Heap does not exist; create it.
s_hHeap = HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
if(s_hHeap == NULL)
return(NULL);
}
// The heap exists for CSomeClass objects.
void* p = HeapAlloc(s_hHeap, 0, size);
if(p != NULL) 
...{
// Memory was allocated successfully; increment
// the count of CSomeClass objects in the heap.
s_uNumAllocsInHeap++;
}
// Return the address of the allocated CSomeClass object.
return(p);
}

/**/
//////////////////////////////////////////////////
void
CSomeClass::
operator
delete (
void
*
p) 
...
{
if(HeapFree(s_hHeap, 0, p))
...{
// Object was deleted successfully.
s_uNumAllocsInHeap--;
}
if(s_uNumAllocsInHeap == 0)
...{
// If there are no more objects in the heap,
// destroy the heap.
if(HeapDestroy(s_hHeap))
...{
//Set the heap handle to NULL so that the new operator
//will know to create a new heap if a new CSomeClass
//object is created.
s_hHeap = NULL;
}
}
}
6、Other heap functions
- Heap32First, Heap32Nexe, Heap32ListFirst, Heap32ListNext
- GetProcessHeap, GetProcessHeaps
- HeapValidate
- HeapCompact
- HeapLock, HeapUnlock
- HeapWalk
本文详细介绍了Windows中的默认堆和辅助堆的概念,包括堆的创建、撤销、内存分配和释放等操作,并通过C++示例展示了如何在应用程序中使用辅助堆进行更有效的内存管理。
9231

被折叠的 条评论
为什么被折叠?



