Исключение при доступе к памяти при чтении, & quot; 0xFEEFEE {value = ???} & quot;

Возможный дубликат:
В 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=???

поэтому у меня есть конструктор по умолчанию, который установит все узлы в нулевой узел (нужно ли мне это? это всегда конструктор по умолчанию, верно?)

Наконец, моя проблема в том, как я могу справиться с этой проблемой? может поймать исключение? все это вызывает необработанное исключение в памяти ххх

Спасибо за ответы

1

Решение

Google запрос не дал результатов

Введите «0xfeeefeee» ​​в запросе. Первый и третий хиты очень хороши. Я скопирую таблицу, показанную в 3-й хит, он показывает магические значения, которые распределитель отладки записывает в кучу:

введите описание изображения здесь

Обратите внимание, как значение 0xFEEEFEEE отображается в столбце «After HeapFree ()». Что говорит вам, что не так с вашим кодом, он обращается к памяти после того, как он был освобожден free () или оператором удаления. Довольно классическая ошибка указателя.

4

Другие решения

Возможно ли это для 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. — Ганс Пассант

тогда ошибка может быть в другом месте …

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector