Đó là thực tế chung để kiểm tra NULL (cho dù bộ nhớ được phân bổ thành công) sau một malloc(), một số điều nhưCó một nhu cầu để kiểm tra NULL sau khi phân bổ bộ nhớ, khi hạt nhân sử dụng bộ nhớ overcommit
void *ptr = malloc(10);
if (ptr != NULL) {
// do some thing usefull
} else {
// no memory. safely return/throw ...
}
với overcommit bộ nhớ được kích hoạt trong hạt nhân, là có một cơ hội nhận được NULL? Tôi có nên thực hiện theo các thực hành kiểm tra tôn giáo NULL cho mỗi phân bổ? Liệu malloc trả về NULL có khơi gợi cơ chế overcommit tăng cường (tôi đoán giá trị 1)?
Như một vấn đề của thực tế hạt nhân Android sử dụng overcommit bộ nhớ (không chắc chắn về giá trị, rất thích biết nó (overcommit giá trị) và ý nghĩa của nó). Một số mã nguồn khung (C/C++) trong Android (có thể là bên thứ 3) không kiểm tra NULL cũng như không nhận được bad_alloc sau khi phân bổ. Tui bỏ lỡ điều gì vậy?
Có một số chủ đề trong SO liên quan đến bộ nhớ quá mức, nhưng không có chủ đề nào trong số đó giải quyết được sự nhầm lẫn của tôi.
CHỈNH SỬA: Nếu quá mức vượt quá đang được sử dụng NULL sẽ không được trả về (giả định 1). Khi không có bộ nhớ vật lý có sẵn và trên cố gắng truy cập vào bộ nhớ được cấp phát (ghi vào bộ nhớ được phân bổ), OOM sẽ giết một số tiến trình và cấp phát bộ nhớ cho ứng dụng cho đến khi nó bị giết lần lượt (giả định 2). Trong cả hai trường hợp tôi không thấy bất kỳ nhu cầu cho cheking NULL (bộ nhớ nhận được phân bổ hoặc quá trình nhận được giết chết). Tôi có đúng trong các giả định của tôi không?
Tính di động không phải là mối quan ngại cho câu hỏi này.
* bộ nhớ quá mức * là gì? Nếu bạn đang nói về một tệp trang trên thiết bị thì KHÔNG, Android (và các thiết bị di động khác) thường không sử dụng tệp trang. Đó là bởi vì việc viết sẽ làm hao mòn bộ nhớ NAND hoặc Flash của SSD sớm hơn. Hay bạn đang nói về mô phỏng và hypervisors? – jww