将 std::unique_ptr<uint8_t[]> 转换为 struct unique_ptr 而不丢失 uint8_t[] 缓冲区

问题描述 投票:0回答:1

有没有办法将

std::unique_ptr<uint8_t[]>(n)
转换为
std::unique_ptr</*some_struct*/>
,以便结构指向与
uint8_t ptr
相同的地址并保存该缓冲区?

auto buffer = std::make_unique<uint8_t[]>(100);
std::unique_ptr<dummy> header = std::move(buffer); // error
struct dummy // string data
{
    uint64_t unk1; // 0x0

    uint64_t string_offset; // 0x8

    uint32_t c59d1c81; // 0x10

    uint16_t byte_length; // 0x14
    uint16_t string_length; // 0x16

    uint64_t unk2; // 0x18

    uint8_t* get_string() { return (uint8_t*)(uint64_t(this) + 0x8 + string_offset); }
};

在此示例中,缓冲区保存

0x20
结构体的
dummy
字节。但是,它还包含一个可以通过
string_offset
成员和
get_string
方法获取的字符串。

c++ casting unique-ptr
1个回答
0
投票

忽略可能的锯齿/对齐问题,您可能会这样做

auto buffer = std::make_unique<uint8_t[]>(100);
std::unique_ptr<dummy, Deleter> header(reinterpret_cast<dummy>(buffer.release()));

struct Deleter
{
    void operator()(dummy* p) const {
        p.~dummy(); // Noop in your case
        delete[] reinterpret_cast<uint8*>(p);
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.