Disseram-me que o código a seguir tem comportamento indefinido até C ++ 20:
int *p = (int*)malloc(sizeof(int));
*p = 10;
Isso é verdade?
O argumento foi que o tempo de vida do int
objeto não é iniciado antes da atribuição do valor a ele ( P0593R6 ). Para resolver o problema, o posicionamento new
deve ser usado:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Precisamos realmente chamar um construtor padrão que seja trivial para iniciar a vida útil do objeto?
Ao mesmo tempo, o código não tem comportamento indefinido em C. puro. Mas, e se eu alocar um int
em código C e usá-lo em código 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;
Ainda é um comportamento indefinido?
int
? Não. Parastd::string
? Sim.