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

Удаление структуры из динамической памяти - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 44, средняя оценка - 4.77
AspUser
0 / 0 / 0
Регистрация: 25.07.2010
Сообщений: 3
25.07.2010, 08:53     Удаление структуры из динамической памяти #1
C++
1
2
3
4
5
6
struct aTapeElement
{
char Operator;
float Operand;
aTapeElement *NextElement;
};
Это кусок кода из 15-го урока книги "Освой самостоятельно С++:
10 минут на урок. - 2-е издание" (САМС).

Имя переменной, в которой храняться данные TapeRoot.
Вызов к членам:
TapeRoot->Operator;
TapeRoot->Operand;
Для перехода на следующую пару используется цикл while
и инструкция
TapeRoot = TapeRoot->NextElement

Распечатка ленты (структуры) успешно,
хоть и с большим трудом, реализована.
Мне нужно узнать, как можно её удалить,
не повредив программу.

Пробовал
C++
1
delete TapeRoot;
Удаляет лишь первый оператор.
Пробовал
C++
1
delete [] TapeRoot;
Удаляются операторы.

В любом случае программа теряет свой функционал.

Приведите, пожалуйста пример удаления данной структуры со ссылкой на саму себя,
чтобы, не перезагружая сам бинарник, монжно было начать запись сначала.

Информация о платформе:
gcc 4.3.0
Среда разработки Eclipse
система ASPLinux 14.0 (Fedora 9).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
25.07.2010, 10:15     Удаление структуры из динамической памяти #2
C++
1
2
3
4
5
6
void del(struct aTapeElement *head){
aTapeElement *elem;
elem = head;
head = head->next;
delete elem;
}
-=ЮрА=-
Заблокирован
Автор FAQ
25.07.2010, 10:52     Удаление структуры из динамической памяти #3
Можно попробовать использовать malloc realloc и free
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct aTapeElement
{
char Operator;
float Operand;
} TapeRoot;
 
Использование в программе
//Выделение памяти под указатель pElement
TapeRoot * pElement = (TapeRoot*)malloc(sizeof(TapeRoot));
//Увеличение блока памяти до Nelem структур типа TapeRoot 
TapeRoot * pElement = (TapeRoot*)realloc((void *)pElement,Nelem*sizeof(TapeRoot));
pElement[i].Operator = 'c'
pElement[i].Operator = 5.4;
//Освобождение памяти
free((void *)pElement);
AspUser
0 / 0 / 0
Регистрация: 25.07.2010
Сообщений: 3
25.07.2010, 10:59  [ТС]     Удаление структуры из динамической памяти #4
Спасибо за советы.
Попробую чуть попозже
и отвечу примерно через неделю.
Maxim Silaev
3 / 3 / 0
Регистрация: 25.07.2010
Сообщений: 5
25.07.2010, 18:17     Удаление структуры из динамической памяти #5
Мда, это же список.

C++
1
2
3
4
5
6
7
8
9
10
11
void Clear(struct aTapeElement * pHead) {
 
struct aTapeElement * pTemp = pHead;
 
while (pHead) {
 
 pTemp = pHead->NextElement;
 delete (pHead);
 pHead = pTemp;
}
}
Кстати, таким же образом можно реализовать и распечатку списка - вместо delete подставить печатающую функцию.
AspUser
0 / 0 / 0
Регистрация: 25.07.2010
Сообщений: 3
12.08.2010, 12:05  [ТС]     Удаление структуры из динамической памяти #6
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
void DeleteTape(aTapeElement *TapeRoot)
{
/*
* Если удалять через ссылки (&),
* в частности операнд,
* то происходит ошибка в распределении памяти.
* Если сослаться структуру или массив структур,
* то из памяти удаляются лишь первый (или все) оператор(ы).
* Удаление через укаазтели (*) нереально.
* Компилятор пишет, что неверный аргумент для unary.
*/      
    if (TapeRoot != NULL)
    {
        aTapeElement *DeleteTapeRoot = TapeRoot; // Создаём ссылку для попытки удалить структуру с данными.
        
/*      delete [] DeleteTapeRoot; // Попытка удалить как массив структур.
 *      // Удаляет только оператор. Операнд не удаляет.
 */
 
/*      delete DeleteTapeRoot; // Попытка удалить как структуру.
 *      // Удаляет только оператор. Операнд не удаляет.
 */
        
/*      DeleteTapeRoot->Operator = NULL; // Попытка обнулить опаратор
 *      DeleteTapeRoot->Operand = NULL; // Попытка обнулить операнд
 *      // Опаранд = 0. Неудача.
 */
        
        (*DeleteTapeRoot).~aTapeElement(); // Вызывается деструктор.
        
            Accumulator(reset); // Обняляем сумматор.
    }
    
    /*
     * Если лента не наполнена,
     * то нужно об этом доложить.
     */
    
    else
    {
        cout << "Лента пока не наполнена. " << endl;
    };
    
    
};



//////////////////////////////////////////////////


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
struct aTapeElement
{
    
    char Operator;
    float Operand;
    aTapeElement *NextElement;
    
    ~aTapeElement(void) // Деструктор.
    {
        NextElement = NULL;
        
        Operator = '*';
        Operand = 0;
 
/* У меня не получилось удалить первые элементы структуры,
 * как и саму структуру из динамической памяти,
 * однако я поступил хитрее, перезаписав значения первого оператора и
 * первого операнда, придал значение NULL следующему элементу и
 * лента стала перезаписываться, хоть и не с самого начала.
 * Теперь нужно выяснить: Что же делается с памятью ?
 * Не произойдёт ли переполнение буфера.
 */
    };
 
};

/////


В моём случае удаление через указатели не удалось.
Слишком сложная программа, наверное.
malloc.h пока не пробовал.
Последний пример тоже.

//////

Скажите.
Мой пример сможет замещать содержимое ячеек памяти или он тупо создаёт новые и
происходит учетчка памяти ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.08.2010, 12:17     Удаление структуры из динамической памяти
Еще ссылки по теме:

C++ Выделение динамической памяти
C++ Удаление динамической памяти
C++ Выделение динамической памяти для чтения каждой структуры из файла

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
12.08.2010, 12:17     Удаление структуры из динамической памяти #7
А разве в функцию удаления нужно передавать не адрес указателя (или ссылку на указатель)?
C++
1
2
3
4
5
6
7
8
void del(aTapeElement*& head)
{
  if(head)
  {
     del(head->NextElement);
     delete head;
  }
}
Yandex
Объявления
12.08.2010, 12:17     Удаление структуры из динамической памяти
Ответ Создать тему
Опции темы

Текущее время: 04:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru