Me dijeron que el siguiente código tiene un comportamiento indefinido hasta C ++ 20:
int *p = (int*)malloc(sizeof(int));
*p = 10;
¿Es eso cierto?
El argumento fue que la vida útil del int
objeto no se inicia antes de asignarle el valor ( P0593R6 ). Para solucionar el problema, se new
debe utilizar la ubicación :
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
¿Realmente tenemos que llamar a un constructor predeterminado que sea trivial para iniciar la vida útil del objeto?
Al mismo tiempo, el código no tiene un comportamiento indefinido en C. puro. Pero, ¿qué int
pasa si asigno un código en C y lo uso en 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;
¿Sigue siendo un comportamiento indefinido?
int
? No.std::string
¿ Para ? Si.