Aşağıdaki kodun C ++ 20'ye kadar tanımsız davranışa sahip olduğu söylendi:
int *p = (int*)malloc(sizeof(int));
*p = 10;
Bu doğru mu?
Argüman, int
değer atanmadan önce nesnenin yaşam süresinin başlamamasıydı ( P0593R6 ). Sorunu çözmek için yerleşim new
kullanılmalıdır:
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Nesnenin yaşam süresini başlatmak için gerçekten önemsiz bir varsayılan kurucu çağırmamız gerekiyor mu?
Aynı zamanda, kodun saf C'de tanımsız davranışı yoktur. Peki ya bir int
C kodunu ayırıp C ++ kodunda kullanırsam?
// 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;
Hâlâ tanımlanmamış bir davranış mı?
int
? Hayır. Ne içinstd::string
? Evet.