Trong thiết kế C++ bình thường, hầu hết các đối tượng có thể bị xóa bằng câu lệnh delete
, hàm free
hoặc tương đương với thư viện cụ thể là free
. Đối với các đối tượng như vậy, việc triển khai unique_ptr
Deleter
có thể là đối tượng không trạng thái được loại bỏ thông qua Tối ưu hóa lớp cơ sở trống. Tuy nhiên, một số thư viện yêu cầu sử dụng một đối tượng khác (có thể chứa một con trỏ hàm hoặc một số ngữ cảnh khác) để xóa các đối tượng khỏi thư viện đó.unique_ptr deleter overhead
typedef struct lib_object lib_object;
struct lib_api {
lib_object (*createInstance)();
void (*freeInstance)(lib_object *o);
};
Người ta có thể quấn này trong unique_ptr
bằng cách lưu trữ một con trỏ lib_api
như một thành viên dữ liệu trong một tùy chỉnh Deleter
, nhưng nếu nhiều lib_object
trường hợp cần phải được quản lý, ví dụ trong một container, nó sẽ tăng gấp đôi chi phí bộ nhớ của việc theo dõi các đối tượng. Những loại mô hình có thể được sử dụng để duy trì nguyên tắc RAII khi giao dịch với thư viện này, trong khi vẫn còn bộ nhớ hiệu quả?
Bạn có thể đặt 'lib_api *' thành thành viên tĩnh của lớp deleter không? – Brian
Tôi nghĩ rằng bạn cần lưu trữ 'freeInstance' trong một lớp dẫn xuất tùy chỉnh của lớp container và vùng chứa của bạn sẽ chứa' lib_object * '.Trong lớp dẫn xuất, bạn phải thực thi hàm hủy có thể gọi 'freeInstance' trên mọi phần tử. – Franck