Cho mã
struct A {};
auto obj = new A;
std::vector<unsigned char> buffer;
buffer.resize(sizeof(obj));
std::memcpy(buffer.data(), &obj, sizeof(obj)); // this copies the pointer, not the object!
// ...
auto ptr = *reinterpret_cast<A**>(buffer.data()); // is this UB?
delete ptr;
là cách sử dụng reinterpret_cast
trong trường hợp này UB? Tôi sẽ nói có, bởi vì memcpy
không bắt đầu vòng đời của một cá thể do đó vi phạm quy tắc răng cưa nghiêm ngặt (đó là lý do tại sao std::bit_cast
đã được thêm vào C ++ 20).
Và nếu tôi thay thế dàn diễn viên bằng một cái khác memcpy
(để đọc con trỏ) thì chương trình có được xác định rõ không?
std::vector
? (Tôi cho rằng các bảo đảm của nó là bất cứ điều gì phân bổ của nó đảm bảo.)
A*
đối tượng trong bộ đệm. Tiêu chuẩn nói về hàm cấp phát tiêu chuẩn :: Hàm phân bổ: "Trả về: Một con trỏ tới phần tử ban đầu của một mảng lưu trữ có kích thước n * sizeof(T)
, được căn chỉnh phù hợp cho các đối tượng thuộc loại T ".
buffer.data()
cái được cho là chứa một con trỏA
, chứ không phảibuffer.data()
chính nó là một con trỏA
.