Какой из этих кодов имеет UB (в частности, который нарушает правило строгого сглаживания)?
void a() {
std::vector<char> v(sizeof(float));
float *f = reinterpret_cast<float *>(v.data());
*f = 42;
}
void b() {
char *a = new char[sizeof(float)];
float *f = reinterpret_cast<float *>(a);
*f = 42;
}
void c() {
char *a = new char[sizeof(float)];
float *f = new(a) float;
*f = 42;
}
void d() {
char *a = (char*)malloc(sizeof(float));
float *f = reinterpret_cast<float *>(a);
*f = 42;
}
void e() {
char *a = (char*)operator new(sizeof(float));
float *f = reinterpret_cast<float *>(a);
*f = 42;
}
Я спрашиваю об этом из-за этого вопроса.
Я думаю, что d
не имеет UB (иначе malloc
был бы бесполезен в С++). И из-за этого представляется логичным, что b
, c
и e
тоже не имеет этого. Я где-то ошибаюсь? Может быть, b
- UB, но c
не?