Sprytne wskaźniki a drzewko
Ostatnio zmodyfikowano 2021-06-27 11:32
Borneq Temat założony przez niniejszego użytkownika |
Sprytne wskaźniki a drzewko » 2021-06-27 10:34:51 Każdy węzeł ma wskaźnik na parenta oraz wektor wskaźników na dzieci. W którym wypadku uzyć unique_ptr, w którym shared , w którym gołych wskaźników? Użyłem unique_ptr do dzieci, wkładam tam obudowany this przy dołączaniu, wskaźnik na parenta jest goły. Był błąd dwukrotnego zwalniania, gdybym użył shared, pewnie nie było by błędu, ale może niekoniecznie by zwolniło, gdyby były pętle. Mam Node: int level string name Node * parent std::vector < std::unique_ptr < Node >> childs; Użycie: std::unique_ptr < Node > root( new Node ), lastNode; lastNode = move( root ); while .... std::unique_ptr < Node > child( new Node( line ) );
child->link( lastNode.get() ); lastNode = move( child ); Procedura link: void Node::link( Node * node ) { Node * ancestor = node; while( ancestor && ancestor->level >= level ) ancestor = ancestor->parent; parent = ancestor; ancestor->childs.push_back( std::unique_ptr < Node >( this ) ); } Chyba zrobię to standardowo, bez sprytnych wskaźników. W końcu wystarczy że w destuktorze będę zwalniał dzieci, by wystarczyło jedno delete root do zwolnienia drzewka. |
|
pekfos |
» 2021-06-27 11:32:51 Używając std::shared_ptr<>, wskaźnik w stronę korzenia powinien być albo zwykły, albo std::weak_ptr<>. std::unique_ptr<> jest tu wystarczające. |
|
« 1 » |