Форум программистов, компьютерный форум 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

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

10.05.2014, 20:56. Просмотров 1115. Ответов 5
Метки (Все метки)

Добрый день! Написал прогу бинарного дерева поиска, все работает, но нужен совет как убрать за собой, тобесь очистить память во избежания утечек. Сам пытался писать 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, то у меня прога зацикливается.
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru