Tôi muốn các đối tượng được shared_ptr quản lý được phân bổ từ một pool, nói giao diện của Pool, làm thế nào để đạt được điều này?Phân bổ tùy chỉnh (pool) với tăng shared_ptr
Trả lời
Dưới đây là đoạn code để làm những gì bạn muốn (có thể sẽ không biên dịch như tôi không có tăng trên tay và tôi đang viết nó từ bộ nhớ):
class YourClass; // your data type, defined somewhere else
boost::object_pool<YourClass> allocator;
void destroy(YourClass* pointer)
{
allocator.destroy(pointer);
}
boost::shared_ptr<YourClass> create()
{
// usage of object_pool<??>::construct requires that you have a
// YourClass::YourClass(void) defined. If you need to pass arguments
// to the new instance, you need to do that separately.
//
// for example using a YourClass::Initialize(your,parameters,here) method
// before returning from this function
return boost::shared_ptr<YourClass>(allocator.construct(), &destroy);
}
// usage:
boost::shared_ptr<YourClass> newObject = create();
tôi thực hiện điều này hai lần, trong hai dự án khác nhau. Trong cả hai chức năng tạo và tiêu diệt được đồng bộ hóa (bạn có thể thêm một khóa boost::mutex
xung quanh việc sử dụng phân bổ) và chúng là thành viên của một lớp nhà máy (và chữ ký của destroy
đã được sửa đổi thành void (YourClass*)
thông qua việc sử dụng boost::bind
).
Bạn cũng có thể tránh phải viết thêm hai chức năng (các destroy
và create
) bằng cách gắn object_pool<YourClass>::destroy
dirrectly trong constructor tăng :: shared_ptr.
Tôi quá lười để viết tất cả những gì bây giờ :).
Sửa (di chuyển bình luận của tôi câu trả lời trong đây để định dạng code):
Để ràng buộc chức năng phá hủy:
class ClassFactory
{
boost::object_pool<YourClass> allocator;
public:
boost::shared_ptr<YourClass> create()
{
return boost::shared_ptr<YourClass>(
allocator.construct(),
boost::bind(&ClassFactory::destroy, this, _1));
}
void destroy(YourClass* pointer)
{
allocator.destroy(pointer);
}
};
ClassFactory
nên có một cuộc đời dài hơn shared_ptr
(nếu ClassFactory
Ví dụ bị xóa, con trỏ này được chuyển đến cá thể shared_ptr
sẽ không hợp lệ - và làm hỏng ứng dụng của bạn khi shared_ptr
xóa phiên bản YourClass
).
Đây là những mối quan tâm gần như trực giao. shared_ptr
không phát một phần trong việc phân bổ đối tượng.
Nơi nó là liên quan đến việc xóa xóa bộ nhớ không còn được tham chiếu. Nếu bạn đã phân bổ từ bất cứ điều gì khác hơn so với đống mặc định, bạn sẽ cần phải provide a custom deleter
Theo tôi được biết, shared_ptr thể được định nghĩa để có một cấp phát tùy chỉnh: 'template
Cấp phát dành cho đối tượng truy cập – philsquared
giải pháp hiển nhiên:
Tạo make_shared
chức năng riêng của bạn và thực thi việc sử dụng phương pháp này để tạo shared_ptr
. Những người xuất phát từ Quy tắc sẽ bị trừng phạt.
Lưu ý:
Có vẻ như có sự nhầm lẫn với vai trò của shared_ptr
. Vai trò của nó là quản lý bộ nhớ hơn so với bạn đã phân bổ, tuy nhiên để làm như vậy nó đòi hỏi một số phân bổ của riêng mình (truy cập và deleter), do đó bạn có thể vượt qua nó một cấp phát cho những người.
Bạn không thể sử dụng 'boost :: allocate_shared' với' boost :: pool_alloc'? – dvide
- 1. Sử dụng trình phân bổ tùy chỉnh với tăng :: bimap
- 2. Phân bổ tùy chỉnh bằng cách sử dụng tăng singleton_pool chậm hơn mặc định
- 3. Có std :: make_shared() sử dụng phân bổ tùy chỉnh?
- 4. static_cast với tăng :: shared_ptr?
- 5. Sử dụng deleter tùy chỉnh với std :: shared_ptr
- 6. Các đối số bổ sung cho deleter tùy chỉnh của shared_ptr
- 7. Các phân bổ tùy chỉnh trong STL chỉ phân bổ dữ liệu thực tế?
- 8. Sử dụng một trình phân bổ tùy chỉnh bên trong một std :: scoped_allocator_adaptor với std :: unordered_map
- 9. Kiểm tra tăng shared_ptr với gdb
- 10. Con trỏ NULL với tăng :: shared_ptr?
- 11. tăng shared_ptr và 'này'
- 12. C++ phân bổ shared_ptr với C++ 11 (std :: shared_ptr): Vẫn còn xấu để khởi tạo shared_ptr thành một biến tạm thời?
- 13. tăng :: shared_ptr container tiêu chuẩn
- 14. cách tăng :: shared_ptr hoạt động?
- 15. Nhận tăng giá :: shared_ptr cho số
- 16. Thực hiện việc tuân thủ RAII HANDLE bằng shared_ptr với một deleter tùy chỉnh
- 17. Lỗi khi tăng lượt xem tùy chỉnh
- 18. Phân bổ bộ nhớ AFNetworking tiếp tục tăng
- 19. Cách tăng phân bổ bộ nhớ cho chương trình
- 20. UITableView với hành vi giống như phân trang tùy chỉnh
- 21. Ví dụ hấp dẫn về trình phân bổ C++ tùy chỉnh?
- 22. Tăng tốc :: shared_ptr <T> và tăng :: shared_ptr <const T> chia sẻ số lượng tham chiếu?
- 23. viewController phương thức init tùy chỉnh với bảng phân cảnh
- 24. iOS: Lưu hình ảnh với độ phân giải tùy chỉnh
- 25. Phân loại GridView với các trường mẫu tùy chỉnh
- 26. Phân tích các URI tùy chỉnh với urlparse (Python)
- 27. UISegmentedControl với màu tùy chỉnh: lỗi dòng phân tách
- 28. Phân bổ, đệm và căn chỉnh ngăn xếp
- 29. Tạo phương thức tùy chỉnh bổ sung bằng jaxb-xjc
- 30. Tùy chỉnh javax.swing.JFileChooser để bao gồm một JTextField bổ sung
Cảm ơn, đây là những gì tôi đang tìm kiếm. Tôi sẽ quan tâm đến việc xem cách nó được thực hiện bằng cách sử dụng một lớp nhà máy, tôi đang gặp vấn đề trong việc ràng buộc chức năng phá hủy. – myahya
Bạn có biết liệu có lý do kỹ thuật nào cho 'cấu trúc' không tham gia bất kỳ đối số nào không? – inf
Gần đây tôi đã làm một cái gì đó rất giống với một lớp hồ bơi templated và viết về nó ở đây: https://www.burgundywall.com/post/shared_pool – Kurt