2015-03-01 5 views
0

Следующий код работает на Linux, но разбился на окнах:Как рекурсивно удалить двоичное дерево на Visual C++ 2013?

#include <iostream> 

struct Node 
{ 
    Node() 
     :data_(0), left_(nullptr), right_(nullptr) 
    { } 

    int data_; 
    Node* left_, *right_; 
}; 

struct Tree 
{ 
    Node* root_; 

    ~Tree() 
    { 
     release(root_); 
    } 

    void release(Node* node) 
    { 
     if (node) 
     { 
      release(node->left_); 
      release(node->right_); 
      delete(node); 
     } 
    } 
}; 

int main() 
{ 
    { 
     auto tree = Tree(); 
    } 
    std::cout << "exit\n"; 
    return 0; 
} 

Выход на Ubuntu 14.04 LTS с помощью г ++ 4.82:

выхода

Разбился на Windows 8 с помощью видео Студия 2013 года, пожаловалась:

Нарушение прав доступа r eading location 0xCCCCCCD0.

Необработанное исключение в 0x009A5CCC: 0xC0000005: Место для обнаружения нарушения доступа 0xCCCCCCD0.

Как это понять? Как это исправить?

+2

Вы должны использовать 'зЬй :: unique_ptr ' вместо 'Node *' –

ответ

2

root_ член Tree не инициализирован. Попытка удалить его не определена.

Вы должны инициализировать его в конструкторе:

Tree() : root_(nullptr) {} 
+0

Вы right..It сейчас работает. Но почему он работает над Unbuntu? Что-нибудь вроде проверки времени выполнения на окнах? –

+2

@YueWang тоже не работает на Ubuntu. Он просто появляется/притворяется, что работает. Неопределенное поведение не означает «гарантированный сбой». (человек, если только это было!) –

Смежные вопросы