{
                  
                  
                      T value;
                  
                  
                      Node<T>* parent = nullptr;
                  
                  
                      Node<T>* left = nullptr;
                  
                  
                      Node<T>* right = nullptr;
                  
                  
                  };
                  
                  
                  
                  
                  
                  И есть такой тест:
                  
                  
                  Node<int>* a = new Node<int>{5, nullptr, nullptr, nullptr};
                  
                  
                  a->left = new Node<int>{7, a, nullptr, nullptr};
                  
                  
                  Heap<int>::swap(a->left, a);
                  
                  
                  
                  
                  
                  своп меняет два узла в куче местами
                  
                  
                  void swap(Node<T>* &a, Node<T>* &b) {
                  
                  
                          auto tmpLeft = a->left;
                  
                  
                          auto tmpRight = a->right;
                  
                  
                          a->parent = b->parent; //после этой строчки b == nullptr
                  
                  
                          a->left = b;
                  
                  
                          a->right = b->right;
                  
                  
                          a->parent->left = a;
                  
                  
                  
                  
                  
                          b->parent = a;
                  
                  
                          b->left = tmpLeft;
                  
                  
                          b->right = tmpRight;
                  
                  
                      }
                  
                  
                  
                  
                  
                  На указанной строчке b становиться null (и дальше, понятное дело, приложение падает), хотя эта строчка никак не трогает b. Как такое может быть? Я категорически не понимаю, что происходит
                  
                  
                
а менее извращенных версий нельзя?
Обсуждают сегодня