美好的一天,
我一直致力于便携式使用的内存分配。
我有一个头文件,其中包含new和delete的函数原型和运算符重载。
void* mem_align16(size_t size);
void mem_delete16(void* memory);
然后我为每个操作系统实现提供了cpp文件。 例如,用于Linux的sbrk和用于Windows的HeapAlloc。
使用Windows时,我必须使用句柄进行内存分配。
HANDLE heap_handle = HeapCreate(0, 0, 0);
我如何以有条理的清洁方式使用手柄?因为需要在main内部启动时使用句柄。我能想到使用句柄的唯一方法是将它作为一个静态变量放在使用函数的cpp文件中,然后使用一个函数来更新静态变量,然后在main.cpp中声明它向前声明< / p>
//inside of win32_heap.cpp
static HANDLE heaphandle = 0;
void make_heap_handle(void) {
heaphandle = HeapCreate(0, 0, 0);
}
//inside of win32_main.cpp
void make_heap_handle(void);
int main(int argc, char** argv) {
make_heap_handle();
return (0);
}
出于某种原因,为了获得可用于我的功能的句柄,这样做是错误的。
答案 0 :(得分:0)
您不需要使用HeapCreate()
来使用HeapAlloc()
/ HeapFree()
,您只需使用GetProcessHeap()
:
void* mem_align16(size_t size)
{
// adjust size as needed...
void *memory = HeapAlloc(GetProcessHeap(), 0, size);
if (!memory) return nullptr;
// adjust memory as needed ...
return memory;
}
void mem_delete16(void* memory)
{
// adjust memory as needed...
HeapFree(GetProcessHeap(), 0, memory);
}
但是,如果您确实想要创建自己的私有堆,则可以创建隐藏在win32_heap.cpp
文件中的单例类,以创建和销毁您的私有堆。 win32_heap.cpp
之外的其余代码将不知道它的存在:
class MyHeap
{
public:
HANDLE hHeap;
MyHeap() {
hHeap = HeapCreate(0, 0, 0);
}
~MyHeap() {
HeapDestroy(hHeap);
}
};
static MyHeap gMyHeap;
void* mem_align16(size_t size)
{
// adjust size as needed...
void *memory = HeapAlloc(gMyHeap.hHeap, 0, size);
if (!memory) return 0;
// adjust memory as needed ...
return memory;
}
void mem_delete16(void* memory)
{
// adjust memory as needed...
HeapFree(gMyHeap.hHeap, 0, memory);
}