Hết bộ nhớ là lỗi duy nhất có thể phát hiện được ... các lỗi khác như giải phóng bộ nhớ đã được giải phóng có thể dẫn đến sự cố.
Một chiến lược để kiểm tra bộ nhớ trong C là sử dụng trình bao bọc cho malloc và realloc (bạn có thể gọi chúng là xmalloc và xrealloc) để kiểm tra bộ nhớ và nếu có hành động lỗi ... in thư và thoát, hoặc có thể cố gắng giải phóng các vùng nhớ và sau đó thử lại việc cấp phát. Điều này đặt tất cả các thử nghiệm ở một nơi, tạo ra các thông báo lỗi nhất quán, và đảm bảo rằng tất cả các nỗ lực phân bổ được kiểm tra thất bại. Các nhược điểm có thể xảy ra được thảo luận trong phần bình luận bên dưới.
Trước đây, chiến lược này hiếm khi có mã C (phù hợp với chất lượng thấp chung trong mã viết bằng ngôn ngữ cổ này), nhưng ngày nay một số khung thư viện trưởng thành kết hợp loại điều này (mặc dù việc triển khai để lại cái gì đó để mong muốn; một lần nữa, xem bình luận bên dưới). Một cách tiếp cận khác, điều rất được khuyến khích, là từ bỏ C và chuyển sang một ngôn ngữ hiện đại hơn ... có thể là C++, trong đó bất kỳ sự thất bại nào của new
dẫn đến ngoại lệ bad_alloc
.
Đối với câu hỏi của bạn ... nếu malloc không thành công, nó trả về NULL; không có con trỏ nào miễn phí. (miễn phí (NULL) là một no-op). Nếu realloc không thành công thì phân bổ ban đầu vẫn không thay đổi. Bạn có thể tìm thấy những điều này bằng cách đọc các trang hoặc thông số kỹ thuật như http://pubs.opengroup.org/onlinepubs/7908799/xsh/realloc.html
Nguồn
2012-06-19 17:55:42
Cuộc sống thực còn tồi tệ hơn: Trên Linux chuẩn, cuộc gọi 'malloc' của bạn có thể thành công, nhưng bộ nhớ không thực sự khả dụng và quá trình của bạn bị giết. Hệ điều hành * oversubscribes * bộ nhớ theo mặc định. Nó thường không phải là một vấn đề lớn. –
Rất may mặc định này là dễ dàng cố định bởi bất cứ ai muốn hệ thống Linux của họ cư xử tốt hơn Win95 ... ('echo" 2 ">/proc/sys/vm/overcommit_memory') –