Форум программистов, компьютерный форум, киберфорум
Наши страницы

Очистка динамической памяти в структуре - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Функция, которая получает в качестве параметров два целых числа и возвращает сумму http://www.cyberforum.ru/cpp-beginners/thread1227378.html
Написать функцию, которая получает в качестве параметров два целых числа и возвращает сумму чисел из диапазона между ними Помогите:-| Буду очень благодарен.
C++ Функция рисует на экране треугольник, высота которого зависит от переданного значения параметра Написать функцию, которая принимает один параметер типа int - высоту. Данная функция рисует на экране треугольник, высота которого зависит от переданного значения параметра. Помогите,... http://www.cyberforum.ru/cpp-beginners/thread1227372.html
C++ Ищу людей, которые изучают язык C++
Ищу людей, которые изучают язык с++, так же как и я. В какой-то момент я понял, что изучать язык в одиночку - это очень тяжело, много чего было бы быстрее изучено, если был бы человек, с которым...
C++ MSVS 2013 пкм->рефакторинг (переименование переменных во всем проекте)
В MSVS 2013 в проектах написанных на шарпе можно тыкнуть пкм по переменной/классу выбырать рефакторинг и переименовать переменную везде, где она встречается. В проекте на с++ этого меню по пкм просто...
C++ Первые шаги по базовому курсу Шилдта - ошибка синтаксиса приведенного кода http://www.cyberforum.ru/cpp-beginners/thread1227333.html
Здравствуйте! Изучаю С++ с нуля по учебнику Базовый курс С++ Шилдт. Каждую программу из примеров компилирую на Visual Studio 2013, до сих пор все запускались. Дошёл до следующего примера, выдаёт...
C++ Передать массив структур в функцию Не получается передать в функцию массив(одномерный, не динамический) из структур, ругается(. Без разницы по указателю, ссылке, значению. подробнее

Показать сообщение отдельно
Faltfromoss
0 / 0 / 0
Регистрация: 28.03.2014
Сообщений: 32

Очистка динамической памяти в структуре - C++

14.07.2014, 23:52. Просмотров 856. Ответов 6
Метки (Все метки)

И снова здравствуйте. Столкнулся с проблемой. Есть задача - написать программу "Телефонный справочник" на основе класса Tree (бинарное дерево), реализовать там всякие функции, не суть важно какие. Класс Tree есть, описывать его не буду, вопрос не в нем. Есть структура, которая содержит данные абонента, и которая является узлом бинарного дерева:

C++
1
2
3
4
5
6
7
8
9
struct Subscriber
{
   char * FIO;
   char * Town;
   char * Number;
   int YearOfBirth;
 
   Subscriber * left, * right, * parent;
};
В ней описаны указатели на память, которая будет выделяться при создании "абонента". Ок. Есть некая функция Add (Subscriber *), которая создает "абонента" и помещает его в нужную позицию в бинарном дереве. Функция работает замечательно, без вопросов.
А есть еще такая замечательная функция Del (Subscriber *), которая должна, соответственно, абонента удалять из базы. Весь код приводить не буду, опишу его алгоритм:

C++
1
2
3
4
5
6
7
void Del (Subscriber *z)
{
... // здесь создается временный указатель Subscriber y, который будет удалён в конце функции.
    // затем выполняются манипуляции с указателями, в результате которых либо в z скопируются данные из y и y удаляется
    // или y == z, удаляется элемент по этому адресу, о чем говорит команда:
 delete y;
}
Вот в связи с этим у меня возникли вопросы. Если бы я создал структуру такого плана:

C++
1
2
3
4
5
6
7
8
9
struct Subscriber
{
   char FIO [50];
   char Town [30];
   char Number [15];
   int YearOfBirth;
 
   Subscriber * left, * right, * parent;
};
То здесь всё ясно, память выделяется в стеке и удаляется вместе с указателем. Но мне захотелось выделить память динамически, в куче. И, по моим соображениям, вот эта команда:
C++
1
    ... delete y; ...
Удалит структуру со всеми указателями и значением int YearOfBirth, но данные FIO, Town, Number останутся где-то в оперативе и будут висеть до последнего. Собственно для очистки динамически выделенной памяти во время удаления объекта и были придуманы деструкторы для классов. И в структурах их тоже можно применять. В общем попробовал решить вопрос сначала так:
C++
1
2
3
4
5
6
...
   delete [] y -> FIO;
   delete [] y -> Number;
   delete [] y -> Town;
   delete y;
...
После чего мне по завершении программы (не во время выполнения!) выскакивает такое окно:

Очистка динамической памяти в структуре

Попробовал аналогичным путем прописать деструктор в структуре:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct Subscriber
{
   char * FIO;
   int YearOfBirth;
   char * Town;
   char * Number;
 
   Subscriber * left, * right, * parent;
public:
   ~Subscriber () {
        delete [] FIO;
        delete [] Number;
        delete [] Town;}
};
В результате при попытке удаления объекта - то же самое. И, кстати, ошибки появляются не всегда. Можно запустить прогу, создать и удалить 2 - 3 - х абонентов, и все будет путем. Поглядел отладчиком, память очищается... А в какой-то определенный момент при удалении может вылезти что-то подобное :/ Я не понимаю. Оно либо не работало бы вообще, либо работало бы нормально, а не так как у меня - работает до определенной точки.

PS кому нужно выложил весь код в архиве, он там поделен на 4 файла. Из меню реализованы пока только 2 функции - добавление и удаление. Ну и 3 - я - вывод списка на экран.
0
Вложения
Тип файла: rar Tel.rar (3.7 Кб, 9 просмотров)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru