2010-05-26 30 views

Trả lời

21

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 destroycreate) 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).

+0

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

+0

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

+0

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

1

Đâ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ó 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

+0

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 shared_ptr (Y * p, D d, A a); ' Câu hỏi đặt ra là, những gì đi cho D nếu tôi đã sử dụng Boost's pool_alloc – myahya

+0

Cấp phát dành cho đối tượng truy cập – philsquared

4

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.

+2

Bạn không thể sử dụng 'boost :: allocate_shared' với' boost :: pool_alloc'? – dvide

Các vấn đề liên quan