Возможный дубликат:
В Visual Studio C ++, каковы представления распределения памяти?
Извините за заголовок, но я действительно не знаю, как мне справиться с этим «value = ???»
получил простое двоичное дерево с treeIterator. Итератор может идти вверх и вниз с ++ или —
Он содержит значение и ключ, а также корневой узел, левый узел, правый узел.
если я начну итератор на дереве
for (Map::TreeIterator i=tree.begin(); i != tree.end(); i++) {
std::cout << i.key() << ": " << i.value() << std::endl;
}
вызовы итератора begin ()
TreeIterator Tree::begin() {
return TreeIterator(m_root->findFirst());
}
вызывает findFirst ()
TreeNode* TreeNode::findFirst() {
if (m_left != NULL) {
return m_left->findFirst();
} else {
return this;
}
}
Хорошо, если дерево содержит много значений.
Теперь я очищаю дерево, распечатываю Count и пытаюсь запустить итератор, чтобы посмотреть, есть ли элементы, показывающие их, в любом случае …
попытка отладки показывает, что итератор переходит в возможно пустое дерево и ищет элементы. он получил корневой узел от дерева, который является нулевым узлом, взял левый узел (также нулевой узел) и запустил findFirst на левом узле.
Здесь мы идем, левый узел (нулевой узел) корня (нулевой узел) не имеет левого узла.
m_left=??? m_right=??? m_up=???
поэтому у меня есть конструктор по умолчанию, который установит все узлы в нулевой узел (нужно ли мне это? это всегда конструктор по умолчанию, верно?)
Наконец, моя проблема в том, как я могу справиться с этой проблемой? может поймать исключение? все это вызывает необработанное исключение в памяти ххх
Спасибо за ответы
Google запрос не дал результатов
Введите «0xfeeefeee» в запросе. Первый и третий хиты очень хороши. Я скопирую таблицу, показанную в 3-й хит, он показывает магические значения, которые распределитель отладки записывает в кучу:
Обратите внимание, как значение 0xFEEEFEEE отображается в столбце «After HeapFree ()». Что говорит вам, что не так с вашим кодом, он обращается к памяти после того, как он был освобожден free () или оператором удаления. Довольно классическая ошибка указателя.
Возможно ли это для m_root
быть нулевым в следующем коде?
TreeIterator Tree::begin() {
return TreeIterator(m_root->findFirst());
}
Если так, попробуйте
TreeIterator Tree::begin() {
if (m_root != NULL)
return TreeIterator(m_root->findFirst());
else
return TreeIterator::end;
}
Однако, если «Ганс Пассант» прав (ниже)
Вам не хватает пары E, это 0xFEEEFEEE. feefee — отличная отладочная диагностика, просто введите ее в запрос Google. — Ганс Пассант
тогда ошибка может быть в другом месте …