【问题标题】:How to allocate SP_DEVICE_INTERFACE_DETAIL_DATA?如何分配 SP_DEVICE_INTERFACE_DETAIL_DATA?
【发布时间】:2011-10-24 21:16:30
【问题描述】:

SP_DEVICE_INTERFACE_DETAIL_DATA 是一个可变长度结构,以一个包含其大小的字段开头,后跟一个数组(不是指向一个的指针)。

用所需的数组长度分配此结构的便捷方法是什么?

【问题讨论】:

    标签: c++ winapi struct memory-management


    【解决方案1】:

    我按照 MSalters 的建议做了:

    std::vector<char> rawbuf(sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + bufferlen);
    SP_DEVICE_INTERFACE_DETAIL_DATA* pDIDD = 
             reinterpret_cast<SP_DEVICE_INTERFACE_DETAIL_DATA*>(&rawbuf[0]);
    

    编辑:

    按照 Raymond Chen 的示例(也讨论过 on his blog),我可以按如下方式分配 SP_DEVICE_INTERFACE_DETAIL_DATA 结构:

    PSP_DEVICE_INTERFACE_DETAIL_DATA pDIDD =
       malloc(FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA, 
                           DevicePath[bufferlen]));
    

    【讨论】:

    • 嗯,不,malloc 应该与 free 匹配,但 std::unique-ptr 将调用 delete。更简单:std::vector&lt;char&gt; rawbuf(sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + bufferlen); SP_DEVICE_INTERFACE_DETAIL_DATA* ptr = reinterpret_cast&lt;SP_DEVICE_INTERFACE_DETAIL_DATA*&gt;(&amp;rawbuf[0]);
    • @MSalters:感谢您指出这一点。你能把这个作为答案,然后我可以删除我的错误帖子并接受你的。
    • 这种技术提供了所需的缓冲区大小,但问题在于所需的数组长度。所需的实际大小为FIELD_OFFSET(SP_DEVICE_INTERFACE_DETAIL_DATA, DevicePath[arraysize])。还要注意std::vector&lt;char&gt; 只保证char-alignment,它比SP_DEVICE_INTERFACE_DETAIL_DATA-alignment 弱。您可能会在某些处理器上出现对齐错误。
    • @Raymond:由于数组重叠(!)SP_DEVICE_INTERFACE_DETAIL_DATA,你必须分配一个连续的缓冲区。 DevicePath[0] 是结构的最后一个元素数组的第一个元素。因此,应该正确解释“如何分配数组长度”的问题。至于 std::allocator 的对齐,AFAICT 在 Windows 上不是问题(因为 std::vector&lt;char&gt; 缓冲区在那里对齐)并且在其他所有地方都不是问题(因为 SP_DEVICE_INTERFACE_DETAIL_DATA 仅适用于 Windows)。
    • std::vector&lt;char&gt; 将被对齐以供任意使用的保证在哪里?我可以看到一个实现,如果向量很小,std::vector&lt;char&gt; 使用内联缓冲区,如果向量很大,则下降到堆中。该内联缓冲区可能未对齐。 (我认为你错过了DevicePath[arraysize][arraysize] 部分。)
    猜你喜欢
    • 2012-05-30
    • 1970-01-01
    • 2019-11-17
    • 2021-04-25
    • 2011-08-31
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    相关资源
    最近更新 更多