std :: unique_ptr <> jako wskaźnik w strukturze opartej na węźle
Ponieważ większość ppl jak łamigłówki I, zacznę to pytanie od (złej pisowni :)), jak wprowadzenie,Uwaga że jeśli nie dbasz o to, możesz pominąć rozgrzewkę (pytanie JG) i przeczytać pytanie G, ponieważ jest to moje „prawdziwe pytanie SO”.
Podczas przeglądania próbek kodu dostarczonych przez potencjalnych nowych pracowników natknąłeś się na połączoną listę, której implementacja używa nowoczesnej funkcji C ++ 11, std :: unique_ptr <>.
template <typename T>
struct Node {
T data;
std::unique_ptr<Node<T>> next;
Node () {}
Node(const T& data_): data(data_) {}
Node(Node& other) { std::static_assert(false,"OH NOES"); }
Node& operator= (const Node& other) {
std::static_assert(false,"OH NOES");
return *new Node();
}
public:
void addNext(const T& t) {
next.reset(new Node<T>(t));
}
};
template<typename T>
class FwdList
{
std::unique_ptr<Node<T>> head;
public:
void add(const T& t)
{
if (head == nullptr)
head.reset( new Node<T>(t));
else {
Node<T>* curr_node = head.get();
while (curr_node->next!=nullptr) {
curr_node = curr_node->next.get();
}
curr_node->addNext(t);
}
}
void clear() {
head.reset();
}
};
Pytanie JG:
Za pomocą tego kodu określ (ignorując brakującą funkcjonalność) problem (y).
Pytanie G: (dodano 2. na podstawie odpowiedzi)
1
Czy istnieje sposób na rozwiązanie problemu (ów) wykrytych w części pytania JG bez użycia surowych wskaźników?
2.
Czy poprawka działa dla kontenerów, w których węzeł zawiera więcej niż jeden wskaźnik (na przykład drzewo binarne ma wskaźniki do lewego i prawego dziecka)
Odpowiedzi:
JG:
przepełnienie stosu :). Powód: rekurencja destruktorów unique_ptr <> wywołana przez funkcję .clear ().
SOL:
(???) Nie mam pojęcia, moje przeczucie jest nie, ale chciałbym skontaktować się z ekspertami.
Krótka historia: czy istnieje sposób na używanie inteligentnych wskaźników w strukturach opartych na węzłach i nie kończących się problemami z SO? Proszę nie mówić, że drzewa prawdopodobnie nie będą zbyt głębokie, lub coś w tym stylu, szukam ogólnego rozwiązania.