Powiedziano mi, że następujący kod ma niezdefiniowane zachowanie do C ++ 20:
int *p = (int*)malloc(sizeof(int));
*p = 10;
Czy to prawda?
Argumentem było to, że czas życia int
obiektu nie jest uruchamiany przed przypisaniem mu wartości ( P0593R6 ). Aby rozwiązać problem, new
należy użyć umieszczenia:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Czy naprawdę musimy wywoływać domyślny konstruktor, który jest trywialny, aby rozpocząć cykl życia obiektu?
Jednocześnie kod nie ma nieokreślonego zachowania w czystym C.Ale co jeśli przydzielę int
kod w C i użyję go w kodzie 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;
Czy nadal jest to niezdefiniowane zachowanie?
int
? Nie. Dlastd::string
? Tak.