Мені сказали, що наступний код має невизначену поведінку до С ++ 20:
int *p = (int*)malloc(sizeof(int));
*p = 10;
Це правда?
Аргументом було те, що час життя int
об’єкта не починається до присвоєння йому значення ( P0593R6 ). Щоб вирішити проблему, new
слід використовувати розміщення:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Чи справді нам доводиться викликати конструктор за замовчуванням, який є тривіальним, щоб почати життя об’єкта?
У той же час, код не має невизначеної поведінки в чистому C. Але, що, якщо я виділю int
код в C і використаю його в коді C ++?
// C source code:
int *alloc_int(void)
{
int *p = (int*)malloc(sizeof(int));
*p = 10;
return p;
}
// C++ source code:
extern "C" int *alloc_int(void);
auto p = alloc_int();
*p = 20;
Це все ще невизначена поведінка?
int
? Ні дляstd::string
? Так.