2010-05-26 9 views

Odpowiedz

21

Oto kod, aby robić to, co chcesz (prawdopodobnie nie będzie kompilować jak nie mam impuls na rękę i piszę z pamięci):

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(); 

I wdrożone to dwukrotnie, w dwa różne projekty. W obu funkcjach tworzenia i niszczenia zostały zsynchronizowane (można dodać blokadę przy użyciu alokatora) i były one członkami klasy fabrycznej (a podpis destroy został zmodyfikowany do void (YourClass*) przez użycie boost::bind).

Można także uniknąć pisania dwóch dodatkowych funkcji (destroy i create), wiążąc object_pool<YourClass>::destroy w konstruktorze boost :: shared_ptr.

Jestem zbyt leniwy, aby napisać to wszystko teraz :).

Edit (przeniesiony mój komentarz odpowiedzieć tutaj dla formatowania kodu):

związać funkcję niszczenia:

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 powinny mieć dłuższą żywotność niż shared_ptr (jeśli ClassFactory instancja jest usuwana, ten wskaźnik przekazany do instancji shared_ptr będzie nieprawidłowy - i awarię aplikacji, gdy shared_ptr usunie instancję YourClass).

+0

Dzięki, tego właśnie szukałem. Byłbym zainteresowany widząc, jak to się robi przy użyciu klasy fabrycznej, mam problemy z powiązaniem funkcji niszczenia. – myahya

+0

Czy wiesz, czy istnieje techniczny powód, dla którego "konstrukt" nie przyjmuje żadnych argumentów? – inf

+0

Niedawno zrobiłem coś bardzo podobnego z szablonową klasą basenową i napisałem o tym tutaj: https://www.burgundywall.com/post/shared_pool – Kurt

1

Są to niemal ortogonalne problemy. shared_ptr nie odgrywa żadnej roli w przydziałach obiektów.

Gdzie jest zainteresowana jest wykreślenie pamięci nie odwołuje. Jeśli przyznane z niczym innym niż domyślny sterty musisz provide a custom deleter

+0

Jak rozumieją, shared_ptr można zdefiniować ma własny przydzielania: 'szablon shared_ptr (T * P D D, A a);' pytanie jest, co się dzieje dla D, gdybym użył Boost's pool_alloc – myahya

+0

Alokator jest dla obiektu licznika – philsquared

4

rozwiązania oczywiste:

Stwórz własną make_shared funkcję i egzekwować stosowanie tej metody do utworzonego shared_ptr. Ci, którzy czerpią z Reguły, zostaną ukarani.

Uwaga:

Wydaje się, że zamieszanie z roli shared_ptr. Jego rolą jest zarządzanie pamięcią, niż to zostało przez Ciebie przydzielone, ale aby to zrobić, wymaga ona przydziału własnego (licznika i deletera), dlatego możesz przekazać im alokację.

+2

Nie można użyć 'boost :: allocate_shared' z' boost :: pool_alloc'? – dvide

Powiązane problemy