Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по деструктору

1.9K
05 марта 2005 года
solovey
113 / / 25.07.2004
Код:
struct TNode
{
    int num;
    TNode * left;
    TNode * right;
   
    TNode();
    ~TNode();

    TNode(int n);
    bool isLeaf();
};

TNode::TNode()
{
    num = 0;
    left = right = 0;
}

TNode::TNode(int n)
{
    num = n;
    left = right = 0;
}

TNode::~TNode()
{
    if(left && left->isLeaf())
        delete left;
    if(right && right->isLeaf())
        delete right;
}

bool TNode::isLeaf()
{
    return ((left == right) && (right == 0));
}

Возникла потребность в простейшем дереве. Дерево хочу хранить в динимически распределяемой памяти. Хочется, чтобы операция
 
Код:
TNode * t;
.....
delete t;

освобождала память,выделенную под все элементы дерева, а не только под его корень. Правильно ли я это сделал?
8.0K
05 марта 2005 года
NetSlow
18 / / 28.02.2005
Ну для того чтобы удалить все дерево а не только его корень надо пройти по нему полностью и удалить каждый элемент, например:

void Clear(TNode* t)
{
if(t<>NULL)
{
Clear(t.left);
Clear(t.right);
delete t;
}
}
    3
    05 марта 2005 года
    Green
    4.8K / / 20.01.2000
    Цитата:
    Originally posted by solovey

    освобождала память,выделенную под все элементы дерева, а не только под его корень. Правильно ли я это сделал?



    Если я правильно понял, то тебе нужно убрать из деструктора проверку isLeaf():

     
    Код:
    TNode::~TNode()
    {
        if(left) delete left;
        if(right)delete right;
    }
    368
    05 марта 2005 года
    rostyslav
    629 / / 13.07.2004
    Цитата:
    Originally posted by Green


    Если я правильно понял, то тебе нужно убрать из деструктора проверку isLeaf():
     
    Код:
    TNode::~TNode()
    {
        if(left) delete left;
        if(right)delete right;
    }


    Если я правильно понял, то

    if(left) delete left;

    означает: если на левой ветке что-то висит, тогда отрубать его, а концов дочерных вершин этой ветки в воду.

    Или ты подрозумеваешь переопределение оператора delete?

    3
    05 марта 2005 года
    Green
    4.8K / / 20.01.2000
    Цитата:
    Originally posted by rostyslav

    Если я правильно понял, то

    if(left) delete left;

    означает: если на левой ветке что-то висит, тогда отрубать его, а концов дочерных вершин этой ветки в воду.

    Или ты подрозумеваешь переопределение оператора delete?



    Ну почему же...
    При уделении левого нода, он в свою очередь удалит свои ноды (в своем деструкторе), а те свои, и так до самого низа.

    368
    05 марта 2005 года
    rostyslav
    629 / / 13.07.2004
    Цитата:
    Originally posted by Green
    Ну почему же...
    При уделении левого нода, он в свою очередь удалит свои ноды (в своем деструкторе), а те свои, и так до самого низа.

    Да ты прав. Это же не void*.

    1.9K
    06 марта 2005 года
    solovey
    113 / / 25.07.2004
    Цитата:
    Originally posted by Green


    Если я правильно понял, то тебе нужно убрать из деструктора проверку isLeaf():
     
    Код:
    TNode::~TNode()
    {
        if(left) delete left;
        if(right)delete right;
    }


    Действительно, так логичнее :) Всем спасибо.

    Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
    Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог