Форум программистов, компьютерный форум 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 разделителей(ну там что то на подобии "!" , "." , "?" , "пробел" и тд... только этот разделитель может быть любым символом), потом вводится текст. В этом тексте могут повторяться разделители к примру так:... подробнее

Показать сообщение отдельно
Melg
416 / 152 / 62
Регистрация: 23.09.2013
Сообщений: 306
11.05.2014, 00:00     Деструктор класса. Как правильно очистить память?
Вот версия, которая должна работать :

Кликните здесь для просмотра всего текста
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
111
112
113
#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),
  right(NULL),
  left(NULL) {
}
 
Tree::Tree(int data) : data(data),
  right(NULL),
  left(NULL) {
}
 
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;
}


По крайней мере тут компилируется:
http://codepad.org/d6uaNtuU

Пришлось волгриндиком пройтись. У Вас использовались указатели на left и right - не инициализированными:

C++
1
2
3
4
5
6
7
8
9
Tree::Tree() : data(0)
{
 
}
 
Tree::Tree(int data)
{
    this->data = data;
}
Я добавил инициализацию нулевыми значениями в обеих перегрузках конструктора:

C++
1
2
3
4
5
6
7
8
9
Tree::Tree() : data(0),
  right(NULL),
  left(NULL) {
}
 
Tree::Tree(int data) : data(data),
  right(NULL),
  left(NULL) {
}
 
Текущее время: 03:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru