Windows Programming系列 堆

来源:互联网 发布:古风mmd动作数据 编辑:程序博客网 时间:2024/04/29 17:03

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, 00);

      
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
原创粉丝点击