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

Очистить динамическую память, выделенную под член структуры

17.05.2014, 22:55. Показов 4564. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объявление и инициализация объекта:
C++
1
pupil B = Constructor("MyName", 18, 50);
Сама структура:
C++
1
2
3
4
5
6
struct pupil{
public:
  char *name = new char[20];
  int age;
  float rating;
};
Нужно в отдельной функции очистить память, выделенную под name.

Пытаюсь сделать так:
C++
1
2
3
void destructor(struct pupil &A){
  delete A.name;
}
При вызове этой функции вылетает ошибка:

Объявление и инициализация объекта:

C++
1
pupil B = Constructor("MyName", 18, 50);
Сама структура:

C++
1
2
3
4
5
6
struct pupil{
public:
  char *name = new char[20];
  int age;
  float rating;
};
Нужно в отдельной функции очистить память, выделенную под name.

Пытаюсь сделать так:

C++
1
2
3
void destructor(struct pupil &A){
  delete A.name;
}
При вызове этой функции вылетает ошибка.
Миниатюры
Очистить динамическую память, выделенную под член структуры  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.05.2014, 22:55
Ответы с готовыми решениями:

Как, создавая указатели, поместить их в уже выделенную динамическую память?
С++ как создавая указатели поместит их в уже выделенную динамическую память вот пример T *all = (T*)malloc(1000); как создавая...

Нужно ли очищать память, выделенную под вектор?
Доброго времени суток. При работе с динамическими массивами всегда чистил память оператором delete. Нужно ли делать тоже самое с векторами,...

Как освободить память, выделенную через new под матрицу?
Здравствуйте!!! Почему-то никак не освобождается память, выделенная оператором new под двумерный массив типа char,- как только идет...

13
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
17.05.2014, 23:06
C++
1
delete [] name;
Добавлено через 55 секунд
Цитата Сообщение от silent Посмотреть сообщение
void destructor(struct pupil &A)
а нормальный деструктор не судьба сделать?
0
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
17.05.2014, 23:16  [ТС]
Цитата Сообщение от Croessmah Посмотреть сообщение
delete [] name;
Не работает. Я даже не понимаю, почему это должно работать. Ведь в функцию мы передаем объект класса, а не просто указатель, чтобы можно было обращаться к нему напрямую
Цитата Сообщение от Croessmah Посмотреть сообщение
а нормальный деструктор не судьба сделать?
В задании сказано написать именно отдельные функции в виде конструктора и деструктора.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.05.2014, 23:19
Цитата Сообщение от Croessmah Посмотреть сообщение
а нормальный деструктор не судьба сделать?
И конструктор тоже
C++
1
2
3
4
5
6
struct pupil{
public:
  char *name = new char[20];
  int age;
  float rating;
};
Вот и пошли говнокоды на C++11

Добавлено через 2 минуты
Цитата Сообщение от silent Посмотреть сообщение
В задании сказано написать именно отдельные функции в виде конструктора и деструктора.
Для конструктора/деструктора в C++ предусмотрен специальный синтаксис.
C++
1
2
3
4
5
6
class A
{
public:
   A() {} // конструктор 
   ~A() {} // деструктор
};
Скорее всего именно это и имелось в виду.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
17.05.2014, 23:25
Цитата Сообщение от Tulosba Посмотреть сообщение
Для конструктора/деструктора в C++ предусмотрен специальный синтаксис.
Ну а коли данимическая память, то еще конструктор копий и оператор присванивания, ну а раз уж C++11, то и возможность перемещать бы не помешала.
Цитата Сообщение от silent Посмотреть сообщение
Ведь в функцию мы передаем объект класса, а не просто указатель, чтобы можно было обращаться к нему напрямую
Будет возможно, если будет нормальный деструктор. И вообще акцент делался на то, что если выделяли память с помощью new[] то у освобождать нужно с помощью delete[], а не delete.
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот и пошли говнокоды на C++11
Ну так всегда же были
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.05.2014, 23:38
Цитата Сообщение от Croessmah Посмотреть сообщение
данимическая память
динамитническая
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну так всегда же были
В данном случае без 11 стандарта не собралось бы просто.
0
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
17.05.2014, 23:39  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Для конструктора/деструктора в C++ предусмотрен специальный синтаксис.
В предыдущем сообщении я уже написал что нужно написать конструктор и деструктор в отдельной функции, вне структуры, в задании так сказано. На саму постановку задания, увы, я повлиять никак не могу: какое есть - такое и есть.

Цитата Сообщение от Tulosba Посмотреть сообщение
Скорее всего именно это и имелось в виду.
Имелось в виду, что
Цитата Сообщение от silent Посмотреть сообщение
Нужно в отдельной функции очистить память, выделенную под name.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
17.05.2014, 23:41
Цитата Сообщение от silent Посмотреть сообщение
нужно написать конструктор и деструктор в отдельной функции, вне структуры, в задании так сказано.
Вне? Если Вам задают такие задания - меняйте препода как можно скорее.
0
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
17.05.2014, 23:47  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Вне? Если Вам задают такие задания - меняйте препода как можно скорее.
Это уже другая тема. Мы немного отклонились от сути, можно что-то поконкретнее по моему вопросу?
0
188 / 187 / 46
Регистрация: 24.03.2011
Сообщений: 670
18.05.2014, 00:21
Цитата Сообщение от silent Посмотреть сообщение
void destructor(struct pupil &A)
Я один не понимаю, зачем тут struct? Или ставилась цель использовать как можно больше 'технологий' - тут и С, и С++ 11...
А по теме: как удалить, вам уже сказали. Единственное - вы Constructor не привели здесь. Хз че там делается внутри, мб поэтому и косяки.
Вот это, кстати, не дословная инструкция, а пример:
Цитата Сообщение от silent Посмотреть сообщение
delete [] name;
В вашем случае будет
C++
1
delete[] A.name;
Но даже неполное удаление такой ошибки вроде вызвать не могло (если там не происходит что-то еще).
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
18.05.2014, 00:53
Цитата Сообщение от silent Посмотреть сообщение
Мы немного отклонились от сути, можно что-то поконкретнее по моему вопросу?
Конкретнее уже сказано. Должны быть нормальные конструктор и деструктор. Потакать желаниям Вашего препода или неправильно понятому заданию я не буду.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
18.05.2014, 00:54
Цитата Сообщение от monolit Посмотреть сообщение
Но даже неполное удаление такой ошибки вроде вызвать не могло
это UB
Цитата Сообщение от 5.3.5/2
If the operand has a class type, the operand is converted to a pointer type by calling the above-mentioned conversion function, and the converted operand is used in place of the original operand for the remainder of this section. In the first alternative (delete object), the value of the operand of delete may be a null pointer value, a pointer to a non-array object created by a previous new-expression, or a pointer to a subobject (1.8) representing a base class of such an object (Clause 10). If not, the behavior is undefined. In the second alternative (delete array), the value of the operand of delete may be a null pointer value or a pointer value that resulted from a previous array new-expression.78 If not, the behavior is undefined.
0
18.05.2014, 01:05

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Сообщение от 5.3.5/2
Забавное цитирование :)

0
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
18.05.2014, 12:20  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct pupil{
public:
  char *name = new char[20];
  int age;
  float rating;
  ~pupil(){ delete [] name; };
};
 
pupil Constructor(){
  pupil A;
  cout << "Enter name : ";
  cin >> A.name;
  cout << "\nEnter age : ";
  cin >> A.age;
  cout << "\nEnter rating : ";
  cin >> A.rating;
  return A;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2014, 12:20
Помогаю со студенческими работами здесь

Почему не очищает память, выделенную под массив структур
#include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; const int ar_size=20; struct CandyBar { char name; double...

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

В двумерном массиве найти сумму элементов диапазона. Переделать под динамическую память.
Нужно переделать эти две проги из статики в динамику, помогите пожалуйста, всем кармы! 2)Дан двумерный массив B , найти сумму...

Функция: подсчет количества слов во введенной строке (под строку выделять динамическую память)
Доброго времени суток! Осваиваю С++, возникла проблема с написанием программы. По заданию необходимо написать функцию, подсчитывающую...

В одномерном массиве найти сумму элементов находящихся в диапазоне от N до K. Переделать под динамическую память.
Нужно переделать эти две проги из статики в динамику, помогите пожалуйста, всем кармы! 1)Дан одномерный массив (A) double, найти сумму...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
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 19.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