Tôi đã được thông báo rằng mã sau có hành vi không xác định cho đến C ++ 20:
int *p = (int*)malloc(sizeof(int));
*p = 10;
Có đúng như vậy không?
Đối số là thời gian tồn tại của int
đối tượng không được bắt đầu trước khi gán giá trị cho nó ( P0593R6 ). Để khắc phục sự cố, new
nên sử dụng vị trí :
int *p = (int*)malloc(sizeof(int));
new (p) int;
*p = 10;
Chúng ta có thực sự phải gọi một hàm tạo mặc định nhỏ để bắt đầu vòng đời của đối tượng không?
Đồng thời, mã không có hành vi không xác định trong C. Tuy nhiên, nếu tôi cấp phát một int
mã trong C và sử dụng nó trong mã C ++ thì sao?
// 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;
Nó vẫn còn là hành vi không xác định?
int
? Không, chostd::string
? Đúng.