Мне сказали, что следующий код имеет неопределенное поведение до C ++ 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
? Да.