Saya diberitahu bahwa kode berikut memiliki perilaku tidak terdefinisi hingga C ++ 20:
int *p = (int*)malloc(sizeof(int));
*p = 10;
Benarkah itu?
Argumennya adalah bahwa masa pakai int
objek tidak dimulai sebelum menetapkan nilainya ( P0593R6 ). Untuk mengatasi masalah tersebut, penempatan new
harus digunakan:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Apakah kita benar-benar harus memanggil konstruktor default yang sepele untuk memulai masa pakai objek?
Pada saat yang sama, kode tersebut tidak memiliki perilaku tidak terdefinisi dalam C murni. Tetapi, bagaimana jika saya mengalokasikan int
dalam kode C dan menggunakannya dalam kode 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;
Apakah ini masih perilaku yang tidak terdefinisi?
int
? Tidak. Untukstd::string
? Iya.