2014-10-25 1 views
0

Детских У меня возникли ошибки при удалении частного класса члена под названием tree2, я пытался использовать "**", "&*", "*&" но я постоянно получаю ошибку после ошибки.Как удалить узел класса с указателем

заголовочный файл:

class tree1 
{ 
    private: 
    class tree2 
     { 
     tree2*child; 
     tree2**child2; 
     int data; 
     }; 
    void clear(tree2** the_root); 
    tree2* root; 
}; 

Я тот, кто поставил четкую функцию there.So я иду в файл .cpp и реализовать это следующим образом:

void tree1::clear(tree2** TheRoot)    
{ 
    if(*TheRoot == NULL) { return; } 

    clear(&(*TheRoot->child1));              
    clear(&(*TheRoot->child2)); 

    delete TheRoot;   
    TheRoot = NULL; 
} 

затем в функция, использующая clear, я называю ее clear(root) или clear(&root) или clear(*root) или clear(&*root). Все комбинации не удались, я продолжаю получать erros. Каков правильный способ удалить этот класс?

ответ

0

, если вы хотите изменить значение, вам нужно позвонить ему с ясным (& root). В стороне вы делаете * root = null, чтобы очистить его.

+0

я получаю ошибку, если я называю как ясный (корень), компилятор говорит, не может инициализировать параметр типа ** с lvalue типа * – user124627

+0

, вот что я говорю, назовите его как clear (& root), не забудьте &. –

+0

нет, я имею ввиду, что я получаю ошибку, если я назову его как clear (& root) – user124627

0

Достаточно использовать только tree2 и tree2* (указатель на tree2 тип) типы данных, не используйте tree2** (указатель на указатель ..).

Не ожидайте, что указанный элемент должен быть NULL, но установите значение указателя на NULL и просто проверьте значения указателя, чтобы определить, указывают ли они на выделенную память или нет.

1

Как вам кажется, ваш root -Поинтер будет NULL после удаления. Именно поэтому просто пройти tree2* в качестве параметра недостаточно, и необходим tree2**.

Линия delete TheRoot; не будет удалять корень, а указатель на корень (который не был выделен с помощью new в вашем примере, что вызывает некоторую скрытую ошибку. Та же проблема заключается в следующей строке. Вы можете решить эту проблему, написав delete *TheRoot; *TheRoot = NULL; .

Но так как вы используете C++, вы можете передать tree2*& так:

void tree1::clear(tree2*& TheRoot)    
{ 
    if (TheRoot == NULL) { return; } 

    clear(TheRoot->child1);              
    clear(TheRoot->child2); 

    delete TheRoot;  
    TheRoot = NULL; 
} 

и назвать его как clear(root);

+0

Это то, что у меня было сначала, компьютер переходит в segfault. gdb указывает на оператор if. – user124627

+0

Если указатели 'tree2' внутри' tree2' неправильно настроены (например, 'NULL'), вы можете получить этот segfault. Попробуйте установить их в NULL явно в конструкторе 'tree2'. – user1781290