Chcę, aby obiekty zarządzane przez shared_ptr były przydzielane z puli, powiedzmy, że interfejs Pool Boost, w jaki sposób można to osiągnąć?Niestandardowy (puli) alokator z doładowaniem shared_ptr
Odpowiedz
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
).
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
Jak rozumieją, shared_ptr można zdefiniować ma własny przydzielania: 'szablon
Alokator jest dla obiektu licznika – philsquared
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ę.
Nie można użyć 'boost :: allocate_shared' z' boost :: pool_alloc'? – dvide
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
Czy wiesz, czy istnieje techniczny powód, dla którego "konstrukt" nie przyjmuje żadnych argumentów? – inf
Niedawno zrobiłem coś bardzo podobnego z szablonową klasą basenową i napisałem o tym tutaj: https://www.burgundywall.com/post/shared_pool – Kurt