Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/133: Рейтинг темы: голосов - 133, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 25.07.2010
Сообщений: 3

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

25.07.2010, 08:53. Показов 28248. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.07.2010, 08:53
Ответы с готовыми решениями:

Удаление динамической структуры
Здраствуйте, вот кусок кода: #define max 32 typedef enum lightColor_t { RED, BLUE,

Удаление динамической структуры структур
Здравствуйте! Есть две структуры: struct TRow { int m; double *elem; }; struct TMatr//масив рядків

Удаление new из динамической памяти
Здравствуйте, у меня есть следующее присвоение: sign->numb = new int; Мне нужно от него избавиться в конце программы, но delete...

6
 Аватар для Sekt
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
25.07.2010, 10:15
C++
1
2
3
4
5
6
void del(struct aTapeElement *head){
aTapeElement *elem;
elem = head;
head = head->next;
delete elem;
}
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
25.07.2010, 10:52
Можно попробовать использовать 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);
1
0 / 0 / 0
Регистрация: 25.07.2010
Сообщений: 3
25.07.2010, 10:59  [ТС]
Спасибо за советы.
Попробую чуть попозже
и отвечу примерно через неделю.
0
3 / 3 / 0
Регистрация: 25.07.2010
Сообщений: 5
25.07.2010, 18:17
Мда, это же список.

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 подставить печатающую функцию.
2
0 / 0 / 0
Регистрация: 25.07.2010
Сообщений: 3
12.08.2010, 12:05  [ТС]
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 пока не пробовал.
Последний пример тоже.

//////

Скажите.
Мой пример сможет замещать содержимое ячеек памяти или он тупо создаёт новые и
происходит учетчка памяти ?
0
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
12.08.2010, 12:17
А разве в функцию удаления нужно передавать не адрес указателя (или ссылку на указатель)?
C++
1
2
3
4
5
6
7
8
void del(aTapeElement*& head)
{
  if(head)
  {
     del(head->NextElement);
     delete head;
  }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.08.2010, 12:17
Помогаю со студенческими работами здесь

Удаление динамической памяти
Всем здрасьте. Имеется вот такая структура. struct ModelType { DWORD FVF; IDirect3DVertexBuffer9* vertexBuffer; ...

Удаление динамической памяти
В книгах по С++ я читал про утечку памяти. Я решил создать программу, в которой будет выделаться 1 Гб памяти и не удаляться. Будучи...

Структуры выделение динамической памяти под массивы
Здравствуйте, Мне нужно создать массив из элементов структуры, и использовать для этого динамическую память,подскажите пожалуйста, в чем...

Удаление и добавление элементов динамической структуры данных
Структура &quot;Абитуриент&quot;: - фамилия, имя, отчество; - год рождения; - оценки вступительных экзаменов (3); - средний балл аттестата. ...

Удаление вектора из области динамической памяти.
Всем привет! Прошу разъяснить. Как правильно удалить содержимое вектора? class Coordinate { public: Coordinate() {} int...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru