2016-04-04 1 views
0

супер немой вопрос, я хочу, чтобы создать бинарное дерево в C++, и следующий мой кодИспользование нового в C++

include <iostream> 
using namespace std; 

struct tree{ 
    tree * child_left = NULL; 
    tree * child_right = NULL; 
    int root; 
    tree * parent = NULL; 
}; 

int main(int argc, const char * argv[]) { 
    tree *t1 = new tree; 
    tree *t2 = new tree; 
    tree *t3 = new tree; 
    tree *t4 = new tree; 
    tree *t5 = new tree; 
    tree *t6 = new tree; 
    tree *t7 = new tree; 
    t4->root = 1; 
    t5->root = 3; 
    t6->root = 6; 
    t7->root = 9; 
    t2->root = 2; 
    t2->child_left = t4; 
    t2->child_right = t5; 
    t3->root = 7; 
    t3->child_left = t6; 
    t3->child_right = t7; 
    t1->root = 4; 
    t1->child_left = t2; 
    t1->child_right = t3; 
    cout << t1->child_left->child_right->root; 
    return 0; 
} 

Это действительно может работать, но если я удалю новый при объявлении тех узлов , xcode будет иметь ошибку (Thread1: EXC_BAD_ACCESS (код = 1, адрес = 0x10)).

Интересно, почему возникает проблема Thread и почему мне нужно использовать новое при объявлении этих узлов.

Заранее спасибо.

+2

Если вы не используете 'новое дерево', то ваши указатели не инициализируются, и вы получаете неопределенное поведение при попытке косвенного использования через них. – Barmar

+0

Делает ли '= NULL' что-либо в контексте' struct'? Я думал, что вам нужно написать конструктор, чтобы установить такую ​​вещь. – tadman

+0

@tadman new in C++ 11 – kfsone

ответ

3

Вы указываете указатели на объект дерева. Без использования новых вы не выделяете никаких объектов для указателей.

int main(int argc, const char * argv[]) { 
tree t1, t2, t3, t4, t5, t6, t7; 

    t4.root = 1; 
    t5.root = 3; 
    t6.root = 6; 
    t7.root = 9; 
    t2.root = 2; 
    t2.child_left = &t4; 
    t2.child_right = &t5; 
    t3.root = 7; 
    t3.child_left = &t6; 
    t3.child_right = &t7; 
    t1.root = 4; 
    t1.child_left = &t2; 
    t1.child_right = &t3; 
    cout << t1.child_left->child_right->root; 
    return 0; 
} 

Это касается создания объектов в стеке, которые затем автоматически разрушаются при завершении области действия.

tree должен, вероятно, иметь ctor, который принимает аргументы, чтобы вы создавали объект вместо мешка данных.

0

Поскольку ключевое слово new фактически создает объект, на который указывает указатель. Без ключевого слова new указатель не инициализирован, а разыменование его приводит к неопределенному поведению.

Кроме того, правильно написанный код должен всегда delete всех объектов, которые были созданы с помощью new, чтобы избежать утечки памяти. Не нужно в этом тривиальном примере, но лучше изучить хорошие привычки на ранней стадии.

0

Для инициализации указателей требуется новый оператор, потому что все ваши переменные node/tree являются указателями. При разработке структур данных обычно характерно использование указателей из-за характера всех них (динамическое число элементов, операции, которые могут выполняться в структурах данных, почти всегда зависят от распределенных значений кучи и т. Д.)

0

Я думал, что должен просто указать, что когда вы используете ключевое слово new, вы фактически создаете переменную в куче и указатель на эту переменную в стеке. Если вы не использовали слово new, вы бы только указали указатель на стек, и вы не создаете переменную.

В C++ всякий раз, когда вы выделяете что-то в куче, вы также должны помнить, что хотите удалить его, когда вы больше не требуете его. В отличие от переменных в стеке они автоматически не удаляются, поскольку они никогда не выходят за рамки. Для этого вам нужно использовать ключевое слово delete, иначе вы получите «утечки памяти».

Предлагаю вам ознакомиться с этим быстрым учебным пособием, чтобы прояснить ваши концепции динамического программирования: http://www.cplusplus.com/doc/tutorial/dynamic/.

Надеюсь, что даст вам некоторое представление о том, что происходит!

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

  • Нет связанных вопросов^_^