std::queue - przechowywanie std::shared_ptr

std::queue - przechowywanie std::shared_ptr
0

wedlug http://www.cplusplus.com/reference/queue/queue/push/

std:queue::push przyjmuje referencje:

Kopiuj
 
void push (const value_type& val);
void push (value_type&& val);

Wiem tez, ze referencja do shared_ptr nie zwieksza use_count, co moze skutkowac nieoczekiwana destrukcja obiektu wskazywanego przez smart pointer.

Czy zna ktoś metodę bezpiecznego przechowywania w kontenerach std smart pointerow z std?

pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
0

Przecież void push (const value_type& val); sobie w środku kopiuje obiekt a nie trzyma referencje do niego (bo niby jak miałby to robić?)


do not code, write prose
edytowany 1x, ostatnio: pingwindyktator
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 21 godzin
1

queue<shared_ptr<cośtam>> powinno działać prawidłowo, ale pytanie dlaczego nie użyjesz po prostu queue<cośtam>?

pingwindyktator
Przecież to zupełnie inne podejście. Nie zawsze da się zastąpić jedno drugim.
Azarien
@pingwindyktator: dlatego nie napisałem "nie rób tak" tylko zapytałem "dlaczego". właściwym rozwiązaniem jest gotowy kontener przechowujący wskaźniki, na pewno Boost ma coś w tym stylu.
pingwindyktator
E tam, kontenery z std z shared_ptr są okej.
0

do usuniecia

Kopiuj

#include <memory>
#include <iostream>
#include <queue>
int main() {
        std::shared_ptr<int> p1(new int(2));
        std::queue<std::shared_ptr<int>> queue;                                                                                                                                                                               
      queue.push(p1);
      std::cout<<p1.use_count();
}
 

res: 2

0

@Azarien, chcę mieć wskaznik na klasę abstrakcyjną a pod tymi wskaznikami rozne obiekty klas dziedziczacych

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.