Cách thích hợp/ưu tiên để cấp phát bộ nhớ trong API C là gì?Thiết kế API C: Ai nên phân bổ?
tôi có thể thấy, lúc đầu, hai lựa chọn:
1) Hãy để cho người gọi làm tất cả những (bên ngoài xử lý bộ nhớ):
myStruct *s = malloc(sizeof(s));
myStruct_init(s);
myStruct_foo(s);
myStruct_destroy(s);
free(s);
Các _init
và _destroy
chức năng là cần thiết vì một số bộ nhớ hơn có thể được phân bổ bên trong, và nó phải được xử lý ở đâu đó.
này có những bất lợi của việc lâu hơn, mà còn là malloc thể được loại bỏ trong một số trường hợp (ví dụ, nó có thể được thông qua một cấu trúc ngăn xếp phân bổ:
int bar() {
myStruct s;
myStruct_init(&s);
myStruct_foo(&s);
myStruct_destroy(&s);
}
Ngoài ra, nó là cần thiết cho người gọi đến biết kích thước của cấu trúc.
2) Ẩn malloc
s trong _init
và free
s trong _destroy
.
Ưu điểm: mã ngắn hơn, vì các hàm sẽ được gọi. Cấu trúc hoàn toàn mờ đục.
Nhược điểm: Không thể chuyển giao cấu trúc được phân bổ theo cách khác.
myStruct *s = myStruct_init();
myStruct_foo(s);
myStruct_destroy(foo);
Tôi hiện đang nghiêng về trường hợp đầu tiên; sau đó một lần nữa, tôi không biết về thiết kế C API.
btw tôi nghĩ đây sẽ là một câu hỏi phỏng vấn tuyệt vời, để so sánh và đối chiếu hai thiết kế. – frankc
Đây là bài viết của Armin Ronacher về cách làm cho các cấu trúc mờ đục nhưng vẫn cho phép tùy chỉnh phân bổ: http://lucumr.pocoo.org/2013/8/18/beautiful-native-libraries/ –