Форум программистов, компьютерный форум 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 строка, но там ничего важного нет....
Нахождение экстремумов функции двух переменных, методами: дихотомии, поразрядного сближения и равномерного пои C++
Здравствуйте, меня интересует нахождение экстремумов функции двух переменных, методами: дихотомии, поразрядного сближения и равномерного поиска. Для одной переменной, это все очень просто и понятно....
C++ Форматированный вывод действительного числа http://www.cyberforum.ru/cpp-beginners/thread1171602.html
Доброго времени суток! Подскажите, пожалуйста как лучше обрезать число? Пример: -1.123e020 после обрезки чтоб дало: -1.12e20 (можно ли чтобы там где е020 стало просто е20?. Это важно). Спасибо...
C++ Удаление лишних (подряд идущих) разделителей при разделении строки Здравствуйте! Задача такая: вводятся в массив razd N разделителей(ну там что то на подобии "!" , "." , "?" , "пробел" и тд... только этот разделитель может быть любым символом), потом вводится... подробнее

Показать сообщение отдельно
Melg
538 / 159 / 64
Регистрация: 23.09.2013
Сообщений: 314
10.05.2014, 22:14
Насколько я понял из Вашего кода, новые объекты в куче выделяются при помощи операции new всего в трех местах.
Первое место:
C++
1
  Tree *root = new Tree(10);
Второе место:
C++
1
  this->left = new Tree;
Третье место:
C++
1
          this->right = new Tree;
Вся соль управления памятью заключается в том, что число памяти выделенное при помощи оператора new должно совпадать с числом памяти удаленного delete. В Вашем случае это означает, что для каждого из 3-х new должен существовать delete. (Подразумевая, что все адреса объектов, полученные вследствие вызова операторов new сохраняют данные в указатели, и ни один из них не перезатирается каким-либо другим значением).

Тогда деструктор должен выглядеть следующим образом :

C++
1
2
3
4
5
6
7
8
Tree::~Tree() {
  if (right) {
      delete right;
    }
  if (left) {
      delete left;
    }
}
или как Вам привычнее- судя по вашему коду:
C++
1
2
3
4
5
6
7
8
Tree::~Tree() {
  if (this->right) {
      delete this->right;
    }
  if (this->left) {
      delete this->left;
    }
}
Первая Ваша ошибка - попытка вызывать деструктор явным образом :
C++
1
{this->right->~Tree(); }
Это не является правильным. Поскольку ключевое слово delete внутри себя содержит не только операции по освобождению памяти, переданной ей в качестве операнда, но и вызов деструктора.
Кроме того, интересно узнать - что Вы подразумевали под зацикливанием программы при невиртуальном деструкторе?

Для верификации на предмет утечек можете использовать мою версию (единым cpp файлом):

Кликните здесь для просмотра всего текста
C++
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
 
using namespace std;
 
class Tree {
public:
  Tree();
  Tree(int data);
  ~Tree();
  void add(int data);
  int getData();
  int maximumElement();
  int minimumElement();
  void printMaximumElements();
  void printMinimumElements();
protected:
private:
  int data;
  Tree *right;
  Tree *left;
};
 
Tree::Tree() : data(0) {
}
 
Tree::Tree(int data) {
  this->data = data;
}
 
Tree::~Tree() {
  if (this->right) {
      delete this->right;
    }
  if (this->left) {
      delete this->left;
    }
}
 
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();
    }
}
 
int main(int argc, char *argv[]) {
  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;
}
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru