Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sprytne wskaźniki a drzewko

Ostatnio zmodyfikowano 2021-06-27 11:32
Autor Wiadomość
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:
C/C++
int level
string name
Node * parent
std::vector < std::unique_ptr < Node >> childs;
Użycie:
C/C++
std::unique_ptr < Node > root( new Node ), lastNode;
lastNode = move( root );
while ....
//read lines from file
std::unique_ptr < Node > child( new Node( line ) );

child->link( lastNode.get() );
lastNode = move( child );

Procedura link:
C/C++
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.
P-178798
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.
P-178799
« 1 »
  Strona 1 z 1