コードを考える
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;
reinterpret_cast
この場合の使用法はUBですか?memcpy
はインスタンスの存続期間を開始しないため、厳密なエイリアシングルールに違反しstd::bit_cast
ているため(そういうわけで、C ++ 20に追加されました)。
そして、キャストを別のキャストに置き換えるとmemcpy
(ポインターを読み取るため)、プログラムは明確に定義されますか?
によって割り当てられたメモリをバッキングストアにアラインメント保証はあり
—
Eljay
std::vector
ますか?(私はその保証がそのアロケーターが保証するものであると思います。)
厳密なエイリアシングも破ると思います。
—
一部のプログラマ、
@anastaciu Googleでの最初のヒット— stats.meta.stackexchange.com/q/5783/3512
—
Konrad Rudolph
質問をもう一度読んだ後は問題ありません
—
n。「代名詞」m。
A*
。(1)アライメント要件が壊れている可能性があり、(2)ここにバッファ内にオブジェクトがないため、それは確かにUB です。「戻り値:サイズのストレージの配列の最初の要素へのポインタ標準は、標準アロケータ::機能を割り当てについて述べてn * sizeof(T)
適宜整列、型Tのオブジェクトに対して」。
buffer.data()
、おそらくへのポインタでありA
、buffer.data()
それ自体ではなく、へのポインタA
です。