Wyciek pamięci przy wstawianiu elementu do listy zaimplementowanej na shared_ptr
Ostatnio zmodyfikowano 2017-08-12 17:29
sbag13 Temat założony przez niniejszego użytkownika |
Wyciek pamięci przy wstawianiu elementu do listy zaimplementowanej na shared_ptr » 2017-08-12 15:09:19 Próbuję zaimplementować listę generyczną opartą o shared_ptr-y. Przy wstawianiu drugiego elementu do listy za pomocą funkcji push_back() wycieka mi pamięć (sprawdziłem valgrindem). Jeśli zakomentuję linijkę: last->next = tmp; wycieku nie ma. Nie wiem czym to jest spowodowane. main:List < int > list; list.push_back( 0 ); list.push_back( 1 );
list.h:#include <memory> #include <iostream>
template < typename T > class Node { T data; std::shared_ptr < Node < T >> next = nullptr; std::shared_ptr < Node < T >> prev = nullptr; public: template < typename C > friend class List; Node < T >( T & gotData ) : data( gotData ) { } };
template < typename T > class List { std::shared_ptr < Node < T >> first = nullptr; std::shared_ptr < Node < T >> last = nullptr; size_t counter = 0; public: List < T >() { } void push_back( T gotData ) { if( last == nullptr ) { first = std::make_shared < Node < T >>( Node < T >( gotData ) ); last = first; } else { std::shared_ptr < Node < T >> tmp = std::make_shared < Node < T >>( Node < T >( gotData ) ); tmp->prev = last; last->next = tmp; last = tmp; } ++counter; } };
|
|
Monika90 |
» 2017-08-12 15:52:30 Ogólnie koncepcja jest błędna, bo powoduje powstanie cykli. Węzeł n jest właścicielem węzła n+1, a węzeł n+1 jest właścicielem węzła n. Podtrzymują się nawzajem przy życiu w nieskończoność. |
|
mokrowski |
» 2017-08-12 17:29:29 Minimalne wymaganie do listy dwukierunkowej to unique_ptr w jedną stronę (np. forward) i surowy wskaźnik w drugą. |
|
« 1 » |