【问题标题】:How do I allocate memory for ZIP struct?如何为 ZIP 结构分配内存?
【发布时间】:2023-01-12 11:44:27
【问题描述】:

我找到了一个 ZIP library,我想用 WinAPI 调用重写它。 我几乎完成了,但是我不能为TState结构分配内存。

state = new TState(); 工作正常!

state = (TState*)HeapAlloc(GetProcessHeap(), 0, sizeof(TState));打破档案!

如果我将HeapAlloc() 更改为malloc(),什么都不会改变!

那么,我做错了什么?

【问题讨论】:

    标签: c++ winapi zip


    【解决方案1】:

    TState 包含一些重要的成员(即:TTreeState tsTDeflateState 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()
    

    否则,您将不得不重写TTreeStateTDeflateState 以使它们成为普通类型(即删除它们的构造函数)。在分配每个TState 实例后,您只需手动初始化它们的数据成员。

    【讨论】:

    • 我需要通过 HeapAlloc() 正确初始化它,我不能使用 CRT 函数实验室工作...
    • 请参阅我刚刚发布的更新。您不能单独使用 HeapAlloc() 对其进行初始化。您无法避免构造函数所做的工作。但是您可以移动逻辑。
    猜你喜欢
    • 2016-01-27
    • 2020-02-03
    • 2011-06-01
    • 1970-01-01
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多