Неожиданное поведение указателя в C ++ - PullRequest
6 голосов
/ 16 октября 2011

У меня проблема с моими указателями в C ++, и было бы здорово, если бы кто-то смог поделиться со мной своим опытом!

Вывод, который я получаю:

1:
2:
END: C
1:C
2:E
END: E

Вывод, который я ожидал:

1:
2:
END: C
1:C
2:C
END: E

Код релевантности такой:

my test.cpp

tree.insert('C');
tree.insert('E');

Функция вставки:

template <typename T> pair<typename btree<T>::iterator, bool> btree<T>::insert(const T& elem) {
  cout <<  "1:" << this->rbegin_->value() << endl;
  btree_node<T> node(elem);
  cout <<  "2:" << this->rbegin_->value() << endl;
  rbegin_ = &node;
  iterator itr;
  pair<typename btree<T>::iterator, bool> p(itr, false);
  cout << "END: " << this->rbegin_->value() << endl;
  return p;
}

Конструктор для btree_node (который в основном пустой):

template <typename T> btree_node<T>::btree_node(const T& elem) : value_(elem), nextCont_(NULL), prevCont_(NULL), nextNode_(NULL), prevNode_(NULL) {}

У класса btree есть закрытая переменная:

btree_node<T>* rbegin_;

Это то, что ямодифицирую.rbegin_ изначально установлен на пустой узел в конструкторе btree следующим образом:

btree_node<T> end(NULL);
rbegin_ = &end;

Кажется, что мой конструктор узла, который ничего не делает, изменяет значение rbegin-> value () ....

Любая помощь приветствуется.

1 Ответ

6 голосов
/ 16 октября 2011

Тебе повезло:

1:
2:
END: C
1:C     <--- Undefined.
2:E
END: E

Ошибка здесь:

template <typename T> pair<typename btree<T>::iterator, bool> btree<T>::insert(const T& elem) {
  cout <<  "1:" << this->rbegin_->value() << endl;
  btree_node<T> node(elem); /* LOCAL parameter, will be deleted when leaving scope*/
  cout <<  "2:" << this->rbegin_->value() << endl;
  rbegin_ = &node; /* Pointing to a LOCAL parameter, when leaving the scope it will point to undefined memory. */
  iterator itr;
  pair<typename btree<T>::iterator, bool> p(itr, false);
  cout << "END: " << this->rbegin_->value() << endl;
  return p;
}

Итак:
A. Выделите память "узла" динамически (malloc или около того).
Б. Я не знаю, что вы пытаетесь сделать, но вы делаете каждую вставку, чтобы заменить головку дерева новым значением и игнорировать старую головку (бесплатно?) ... Я не думаю, что вы хотите, чтобы вы хотели делаем.

...