Форум программистов, компьютерный форум CyberForum.ru

Деструктор класса. Как правильно очистить память? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Алгоритм Флойда-Уоршелла http://www.cyberforum.ru/cpp-beginners/thread1171675.html
Можно ли переделать алгоритм так, что бы он выдавал не только кратчайший путь, но и указывал через какие вершины графа он проходит? Допустим есть готовая матрица смежности, ввести начальную и конечную вершины и получить желаемый ответ. Спасибо. Вот сам алгоритм (внизу есть реализация)...
C++ Программа для работы с перемешанной таблицей, использующей перемешивание сложением, по запросам оператора Вообщем народ такая беда у меня есть задание состоящие из двух частей, с первой проблем с частью А нет все норм. А вот со второй маленький косяк, двоичный файл не создается и даже не открывается. Короче вот задание: Написать программу для работы с перемешанной таблицей, использующей перемешивание сложением, по запросам оператора. Перемешанная таблица организована вектором; каждый элемент... http://www.cyberforum.ru/cpp-beginners/thread1171648.html
C++ Ошибка : " L Buffer is too small & & 0"
Здравствуйте. У меня возникла странная проблема: в недалеком прошлом рабочая программа начала выдавать ошибку: " L Buffer is too small & & 0". Не нравиться ей 30 строка, но там ничего важного нет. Помогите,пожалуйста,решить проблему. Скрин ошибки: #include "stdafx.h" #include "iostream" #include "conio.h"
Нахождение экстремумов функции двух переменных, методами: дихотомии, поразрядного сближения и равномерного пои C++
Здравствуйте, меня интересует нахождение экстремумов функции двух переменных, методами: дихотомии, поразрядного сближения и равномерного поиска. Для одной переменной, это все очень просто и понятно. А вот для двух, мне совсем ничего не понятно, и в интернете нету даже теории по нахождению экстремумов именно этими методами. Если кто, что либо знает, пожалуйста подскажите что можете. Программу для...
C++ Форматированный вывод действительного числа http://www.cyberforum.ru/cpp-beginners/thread1171602.html
Доброго времени суток! Подскажите, пожалуйста как лучше обрезать число? Пример: -1.123e020 после обрезки чтоб дало: -1.12e20 (можно ли чтобы там где е020 стало просто е20?. Это важно). Спасибо большое!
C++ Удаление лишних (подряд идущих) разделителей при разделении строки Здравствуйте! Задача такая: вводятся в массив razd N разделителей(ну там что то на подобии "!" , "." , "?" , "пробел" и тд... только этот разделитель может быть любым символом), потом вводится текст. В этом тексте могут повторяться разделители к примру так:... подробнее

Показать сообщение отдельно
kultttemo
3 / 3 / 1
Регистрация: 10.05.2014
Сообщений: 15
10.05.2014, 20:56     Деструктор класса. Как правильно очистить память?
Добрый день! Написал прогу бинарного дерева поиска, все работает, но нужен совет как убрать за собой, тобесь очистить память во избежания утечек. Сам пытался писать delete в деструторе, но толку не дало. Вот коды:
//Tree.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#ifndef TREE_H
#define TREE_H
 
 
class Tree
{
    public:
        Tree();
        Tree(int data);
        virtual ~Tree();
        void add(int data);
        int getData();
        int maximumElement();
        int minimumElement();
        void printMaximumElements();
        void printMinimumElements();
    protected:
    private:
        int data;
        Tree *right;
        Tree *left;
};
 
#endif // TREE_H
//Tree.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "Tree.h"
#include <iostream>
 
using namespace std;
 
Tree::Tree() : data(0)
{
 
}
 
Tree::Tree(int data)
{
    this->data = data;
}
 
Tree::~Tree()
{
 
}
 
void Tree::add(int data)
{
    if (this->data > data)
    {
        if (!this->left)
        {
            cout << "n< ";
            this->left = new Tree;
            this->left->data = data;
            return;
        }
        cout << "<";
        this->left->add(data);
        return;
    }else
    {
        if (!this->right)
        {
            cout << "n> ";
            this->right = new Tree;
            this->right->data = data;
            return;
        }
        cout << ">";
        this->right->add(data);
        return;
    }
 
    cout << "Error! Something went wrong in Tree" << endl;
}
 
int Tree::getData()
{
    return this->data;
}
 
int Tree::maximumElement()
{
    return (this->right)?this->right->maximumElement():this->data;
}
 
int Tree::minimumElement()
{
    return (this->left)?this->left->minimumElement():this->data;
}
 
void Tree::printMaximumElements()
{
    cout << this->data << " -> ";
    if (this->right)
        this->right->printMaximumElements();
}
 
void Tree::printMinimumElements()
{
    cout << this->data << " -> ";
    if (this->left)
        this->left->printMinimumElements();
}
//main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include "Tree.h"
 
using namespace std;
 
int main()
{
    Tree *root = new Tree(10);
 
    root->add(12);
    root->add(15);
    root->add(14);
    root->add(3);
    root->add(1);
    root->add(2);
    root->add(-1);
    cout << endl;
    cout << root->getData() << endl;
    cout << root->maximumElement() << endl;
    cout << root->minimumElement() << endl;
    cout << "\nMaximum elements: ";
    root->printMaximumElements();
    cout << "\n\nMinimum elements: ";
    root->printMinimumElements();
    cout << endl;
    delete root;
    return 0;
}

Вопрос в правильном деструкторе. Я ничего в нем не менял, но судя по логике указатели на правое и левое поддерево не удаляются. При попытке задать что-то типа:
C++ (Qt)
1
2
3
4
5
if (this->right)
{this->right->~Tree(); }
if (this->left)
{this->left->~Tree();}
this->delete;
Прошу обратить внимание на то, что деструктор виртуальный, ибо если я убираю virtual, то у меня прога зацикливается.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 19:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru