Hãy nói rằng tôi đang viết một thư viện nhỏ trong C - một số cấu trúc dữ liệu, nói. Tôi nên làm gì nếu tôi không thể cấp phát bộ nhớ?Thiết kế API C: phải làm gì khi malloc trả về NULL?
Điều này có thể khá quan trọng, ví dụ: Tôi cần một số bộ nhớ để khởi tạo cấu trúc dữ liệu ở nơi đầu tiên, hoặc tôi đang chèn một cặp khóa-giá trị và muốn bọc nó trong một cấu trúc nhỏ. Nó cũng có thể ít quan trọng hơn, ví dụ một cái gì đó giống như một hàm pretty_print
xây dựng một biểu diễn chuỗi đẹp của nội dung. Tuy nhiên, nó thường nghiêm trọng hơn so với lỗi trung bình của bạn - có thể không có một điểm nào trong việc tiếp tục. Một tấn mẫu sử dụng của malloc
trực tuyến chỉ cần thẳng lên thoát khỏi chương trình nếu nó trả về NULL
. Tôi đoán rất nhiều mã khách hàng thực hiện điều đó quá - chỉ cần bật lên một số lỗi, hoặc viết nó vào stderr
, và hủy bỏ. (Và rất nhiều mã thực sự có thể không kiểm tra giá trị trả về của malloc
ở tất cả.)
Đôi khi nó có ý nghĩa để trả lại NULL
, nhưng không phải lúc nào. Mã lỗi (hoặc chỉ một số giá trị boolean success
), hoặc là giá trị trả về hoặc tham số hoạt động tốt, nhưng có vẻ như chúng có thể lộn xộn hoặc làm tổn thương khả năng đọc của API (sau đó lại có thể được mong đợi bằng ngôn ngữ như C?). Một tùy chọn khác là có một số loại trạng thái lỗi nội bộ mà người gọi có thể truy vấn sau đó, ví dụ: với chức năng get_error
, nhưng sau đó bạn phải cẩn thận về an toàn luồng và có thể dễ dàng bỏ lỡ; mọi người có xu hướng không hài lòng về việc kiểm tra lỗi, và nếu đó là một chức năng riêng biệt, họ có thể không biết về nó, hoặc họ có thể không bận tâm (nhưng sau đó tôi đoán đó là vấn đề của họ).
(Tôi đã đôi khi thấy malloc
bọc trong một chức năng mà chỉ cố gắng một lần nữa cho đến khi bộ nhớ có sẵn ...
void *my_malloc(size_t size)
{
void *result = NULL;
while (result == NULL)
result = malloc(size);
return result;
}
Nhưng điều đó dường như loại ngớ ngẩn và có thể nguy hiểm.)
một là gì cách thích hợp để xử lý điều này?
Lối ra duyên dáng sẽ là lựa chọn của tôi. – Till
@Till: Điều đó hoàn toàn không được chấp nhận đối với mã thư viện. –
@R. whoopy, tôi hoàn toàn bỏ qua dòng đầu tiên khi đọc câu hỏi này. Trong trường hợp đó, trả về FALSE/NULL và thêm một hàm trạng thái lỗi để biết chi tiết. – Till