Các tiêu chí tôi muốn sử dụng để quyết định là:
Nếu mã bên ngoài chức năng gọi có thể biết có bao nhiêu bộ nhớ để phân bổ, sau đó nó là tốt hơn để có mã gọi điện thoại cấp phát bộ nhớ.
Nếu mã bên ngoài hàm được gọi không thể biết số lượng bộ nhớ cần phân bổ, thì hàm được gọi phải thực hiện cấp phát bộ nhớ. Có khả năng sau đó sẽ có một hàm thứ hai có sẵn để giải phóng bộ nhớ được trả về bởi hàm đầu tiên (hàm 'được gọi là'), trừ khi nó chỉ là một đơn free()
cần thiết. Tài liệu chức năng nên làm rõ điều này.
Ví dụ, nếu hàm được gọi là đọc cấu trúc cây hoàn chỉnh từ tệp, chức năng sẽ phải cấp phát bộ nhớ. Tuy nhiên, cũng sẽ có một hàm đồng hành để giải phóng bộ nhớ (vì mã được gọi biết làm thế nào để thực hiện nó và mã gọi không cần phải biết). Mặt khác, nếu hàm được gọi là đọc một danh sách đơn giản các giá trị số nguyên và dấu phẩy động vào một cấu trúc kích thước cố định, thì tốt hơn hết là làm cho hàm gọi điện thoại cấp phát bộ nhớ. Lưu ý rằng tôi đã bỏ qua 'chuỗi'! Nếu các chuỗi có kích thước cố định trong cấu trúc, thì hàm gọi có thể thực hiện việc phân bổ, nhưng nếu các chuỗi có kích thước biến, thì có lẽ hàm được gọi thực hiện phân bổ.
Thư viện chuẩn C có các chức năng như fgets()
, mong đợi mã gọi để phân bổ bộ nhớ được sử dụng. Trình tự gọi cho biết số fgets()
có bao nhiêu không gian. Bạn gặp vấn đề nếu bạn không cung cấp đủ bộ nhớ. (Sự cố với fgets()
là bạn chỉ có thể bắt đầu dòng văn bản chứ không phải toàn bộ dòng văn bản.)
Thư viện POSIX 2008 cung cấp đủ không gian cho dòng.
asprintf()
và các chức năng liên quan (xem TR24731-2) cấp phát bộ nhớ theo yêu cầu. Các chức năng snprintf()
không - nó được cho biết bao nhiêu không gian có sẵn, nó sử dụng không nhiều hơn thế, và nói bao nhiêu nó thực sự cần thiết, và nó là vào bạn để lưu ý nếu bạn không cung cấp đủ không gian và làm một cái gì đó về nó (phân bổ nhiều không gian hơn và thử lại, hoặc vô tình bỏ qua giá trị cắt ngắn và tiếp tục như thể không có gì sai).
Nguồn
2012-11-18 17:22:34
malloc bên trong hoặc bên ngoài không quan trọng, chỉ cần đảm bảo giải phóng bộ nhớ được cấp phát đó là – Omkant
tùy thuộc vào tình huống! –