realloc
công trình đằng sau hậu trường gần như thế này:
- Nếu có đủ không gian trống phía sau khối hiện hành để thực hiện yêu cầu, mở rộng khối hiện tại và trả về một con trỏ đến đầu của khối .
- Khác nếu có một khối đủ lớn miễn phí ở nơi khác, sau đó phân bổ khối đó, sao chép dữ liệu từ khối cũ qua, giải phóng khối cũ và trả về con trỏ đến đầu khối mới
- Báo cáo lỗi khác trở về
NULL
.
Vì vậy, bạn có thể kiểm tra cho sự thất bại bằng cách kiểm tra cho NULL
, nhưng lưu ý rằng bạn không ghi đè lên con trỏ cũ quá sớm:
int* p = malloc(x);
/* ... */
p = realloc(p, y); /* WRONG: Old pointer lost if realloc fails: memory leak! */
/* Correct way: */
{
int* temp = realloc(p, y);
if (NULL == temp)
{
/* Handle error; p is still valid */
}
else
{
/* p now possibly points to deallocated memory. Overwrite it with the pointer
to the new block, to start using that */
p = temp;
}
}
Nguồn
2010-09-10 11:55:50
Đây có phải là 'realloc' hoạt động cho mọi triển khai không? –
@CoolGuy: Một số triển khai có thể không (có thể) thực hiện bước đầu tiên của việc mở rộng khối hiện tại, nhưng nếu không thì đây là hành vi quan sát được của 'realloc' cho tất cả các triển khai. –