Wyciek pamięci przy wstawianiu elementu do listy zaimplementowanej na shared_ptr
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Wyciek pamięci przy wstawianiu elementu do listy zaimplementowanej na shared_ptr

AutorWiadomość
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:
C/C++
List < int > list;
list.push_back( 0 );
list.push_back( 1 );

list.h:
C/C++
#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 ) {
            //empty list
            first = std::make_shared < Node < T >>( Node < T >( gotData ) );
            last = first;
        } else {
            //not empty list
            std::shared_ptr < Node < T >> tmp = std::make_shared < Node < T >>( Node < T >( gotData ) );
            tmp->prev = last;
            last->next = tmp;
            last = tmp;
        }
        ++counter;
    }
   
};
P-163932
» 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ść.
P-163934
» 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ą.
P-163935
« 1 »
 Strona 1 z 1