Tôi đã viết một trình bao bọc c ++ mở rộng xung quanh một thư viện c rất khó sử dụng nhưng cũng rất hữu ích. Mục tiêu là để có được sự kiên định của c ++ trong việc phân bổ đối tượng, phơi bày các thuộc tính của nó, giải phóng đối tượng, sao chép ngữ nghĩa, v.v ...
Vấn đề là ở đây: đôi khi thư viện c muốn đối tượng bên dưới (một con trỏ tới đối tượng) và hàm hủy lớp không được phá hủy bộ nhớ bên dưới. Trong khi hầu hết thời gian, hàm hủy nên phân bổ đối tượng bên dưới. Tôi đã thử nghiệm với việc thiết lập một bool hasOwnership
cờ trong lớp để hàm hủy, toán tử gán, v.v ... sẽ biết liệu nó có nên giải phóng bộ nhớ bên dưới hay không. Tuy nhiên, điều này là cồng kềnh cho người dùng, và đôi khi, không có cách nào để biết khi nào một quá trình khác sẽ sử dụng bộ nhớ đó.
Hiện tại, tôi đã thiết lập nó khi bài tập đến từ một con trỏ cùng loại với kiểu cơ bản, sau đó tôi đặt cờ hasOwnership. Tôi làm tương tự khi hàm tạo quá tải được gọi bằng cách sử dụng con trỏ từ thư viện c. Tuy nhiên, điều này vẫn không xử lý trường hợp khi người dùng đã tạo đối tượng và chuyển nó đến một trong các chức năng của tôi để gọi c_api và thư viện lưu trữ con trỏ để sử dụng sau. Nếu họ xóa đối tượng của mình, thì chắc chắn sẽ gây ra một segfault trong thư viện c.
Có một mẫu thiết kế sẽ đơn giản hóa quá trình này? Có lẽ một số loại tham khảo đếm?
unique_ptr
trong hầu hết các trường hợp có thể xử lý loại tài nguyên này, vì vậy bạn không cần phải tự thực hiện quản lý tài nguyên. unique_ptr
sử dụng release
phương thức để từ bỏ quyền sở hữu đối tượng được lưu trữ.