有没有办法将
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
方法获取的字符串。
忽略可能的锯齿/对齐问题,您可能会这样做
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);
}
};