Mir wurde gesagt, dass der folgende Code bis C ++ 20 ein undefiniertes Verhalten aufweist:
int *p = (int*)malloc(sizeof(int));
*p = 10;
Ist das wahr?
Das Argument war, dass die Lebensdauer des int
Objekts nicht vor dem Zuweisen des Werts gestartet wird ( P0593R6 ). Um das Problem zu beheben, new
sollte die Platzierung verwendet werden:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Müssen wir wirklich einen Standardkonstruktor aufrufen, der trivial ist, um die Lebensdauer des Objekts zu starten?
Gleichzeitig hat der Code in reinem C kein undefiniertes Verhalten. Aber was ist, wenn ich einen int
in C-Code zuordne und ihn in C ++ - Code verwende?
// 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;
Ist es noch undefiniertes Verhalten?
int
? Nein. Fürstd::string
? Ja.