我找到了一个ZIP库,我想用WinAPI调用重写它。我几乎已经完成了,但是我不能为TState
结构分配内存。
state = new TState();
工作正常!
state = (TState*)HeapAlloc(GetProcessHeap(), 0, sizeof(TState));
破坏档案!
如果我将HeapAlloc()
更改为malloc()
,没有任何变化!
那么,我做错了什么?
TState
包含一些重要的成员(即:TTreeState ts
和TDeflateState ds
),它们有自己的构造函数,new
可以正确调用这些构造函数,但malloc()
/HealAlloc()
不能调用这些构造函数。因此,您需要使用placement-new
在分配的内存中正确构造TState
对象,例如:
buffer = HeapAlloc(GetProcessHeap(), 0, sizeof(TState)); // or malloc()
state = new(buffer) TState;
...
state->~TState();
HeapFree(GetProcessHeap(), 0, buffer); // or free()
否则,您将不得不重写TTreeState
和TDeflateState
,使它们成为平凡的类型(即,删除它们的构造函数)。在分配了每个TState
实例之后,您只需要手动初始化它们的数据成员。