Câu hỏi nói lên tất cả nhưng đây là một ví dụ:Làm thế nào để xử lý realloc khi nó không thành công do bộ nhớ?
typedef struct mutable_t{
int count, max;
void **data;
} mutable_t;
void pushMutable(mutable_t *m, void *object)
{
if(m->count == m->max){
m->max *= 2;
m->data = realloc(m->data, m->max * sizeof(void*));
}
// how to handle oom??
m->data[m->count++] = object;
}
Làm thế nào tôi có thể xử lý chạy ra khỏi bộ nhớ và không NULL ra tất cả các dữ liệu của tôi?
chỉnh sửa - giả sử có điều gì đó có thể được thực hiện, ví dụ: giải phóng bộ nhớ ở đâu đó hoặc ít nhất là nói với người dùng "bạn không thể làm điều đó - bạn đã hết bộ nhớ". Lý tưởng nhất là tôi muốn để lại những gì được phân bổ ở đó.
phụ thuộc nhiều vào ứng dụng ... nhưng có một điều chắc chắn, OOM là khá quan trọng. – jldupont
liên quan: http://stackoverflow.com/questions/1941323/always-check-malloced-memory – jldupont
Chỉ cần thêm vào một vài câu trả lời ở đây, một ý tưởng về cách xử lý một thất bại 'realloc()' (trong trường hợp của bạn) sẽ làm 'm-> max/= 4; m-> max * = 3; 'và thử gọi lại' realloc() 'để xem liệu chúng ta có thể vẫn còn thêm một vài byte nữa không. Bạn thậm chí có thể thử một vài lần với kích thước liên tục nhỏ hơn, nhưng tại một số điểm nó sẽ không có giá trị nó. –