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, 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;
}
}
}
...{
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 Programming系列 堆
- Windows Programming系列 ErrorShow
- Windows Programming系列 Unicode
- Windows Programming系列 进程
- Windows Programming系列 作业
- Windows Programming系列 线程
- Windows Programming系列 内核对象
- Windows Programming系列 线程的堆栈
- Windows Programming系列 线程本地存储器
- Windows Programming/Programming CMD
- Windows Programming系列 线程的调度、优先级和亲缘性
- Windows Programming系列 用户方式中线程的同步
- Windows Programming系列 线程与内核对象的同步
- Programming Windows
- Windows programming
- windows程序员进阶系列:《软件调试》之Win32堆
- windows程序员进阶系列:《软件调试》之堆 (一)
- windows程序员进阶系列:《软件调试》之Win32堆 (二)
- Red Hat Enterprise Linux 无法用VNC Viewer连接,报错:无法连接的主机,10065!
- 海耶斯還需要證明自己
- 裸机LCD汉字显示实现
- 自己动手做一个迷你 Linux 系统
- 【站长之窗第八期】安全卫士——“邪恶八进制”冰血封情
- Windows Programming系列 堆
- MySQL连接资源占用与状态分析(v1)
- Linux下Makefile的automake生成全攻略
- 比尔盖茨给的11个人生建议
- 常用DOS命令祥解
- autotools使用流程
- xhtml学习之我见
- 七问七答 SOA
- BIND9 的安装与配置