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
- 1. Niestandardowy alokator pamięci dla mapy STL
- 2. Dziurkowanie z doładowaniem :: asio
- 3. Niestandardowy alokator pamięci/menedżer w C? jakie podejście?
- 4. Listy zmiennych zmiennych z doładowaniem?
- 5. Budynek rozbudowy Pythona z doładowaniem
- 6. Dlaczego alokator jest const w wektorze?
- 7. C++ Korzystanie z klas z doładowaniem :: lexical_cast
- 8. Błąd serializacji klasy abstrakcyjnej z doładowaniem
- 9. znalezienie kurtozy dla zbioru danych z doładowaniem
- 10. Skompiluj czasy z doładowaniem ducha x3
- 11. shared_ptr z szablonami
- 12. C++ 0x std :: shared_ptr vs. boost :: shared_ptr
- 13. Xcode5.1.1 i Xcode6 beta7 iOS7.1 64-bitowy [Alokator] Alokator jest nieważny, wraca do malloc
- 14. boost :: alokator pamięci międzyprocesorowej na anonimowym segmencie
- 15. NULL wskaźnik z boostem :: shared_ptr?
- 16. Tworzenie shared_ptr z surowego wskaźnika
- 17. Różnice między tr1 :: shared_ptr i boost :: shared_ptr?
- 18. Korzystanie z puli wieloprocesowej pracowników
- 19. Brak puli autorelease z JOGL
- 20. dlaczego alokator w C++ potrzebuje konstruktora kopiowania?
- 21. shared_ptr in std :: tr1
- 22. std :: shared_ptr and Inheritance
- 23. "Podłączanie" SDL_Surface do shared_ptr
- 24. Jak radzić sobie z ewoluującym C++ std :: namespace? np: std :: tr1 :: shared_ptr vs. std :: shared_ptr vs. boost :: shared_ptr vs. boost :: tr1 :: shared_ptr
- 25. Przepuścić shared_ptr do OpenGL?
- 26. Korzystanie z Boost Python & std :: shared_ptr
- 27. Konwersja z polimorfizmu shared_ptr na weak_ptr
- 28. C++ skopiować konstruktora z członkami shared_ptr
- 29. Pośrednie konwersji z int do shared_ptr
- 30. użyciu std :: shared_ptr z chronioną konstruktora \ destructor
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