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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
silent
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
#1

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

17.05.2014, 22:55. Просмотров 604. Ответов 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
Миниатюры
Очистить динамическую память, выделенную под член структуры  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.05.2014, 22:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Очистить динамическую память, выделенную под член структуры (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,401
Записей в блоге: 3
Завершенные тесты: 1
17.05.2014, 23:06 #2
C++
1
delete [] name;
Добавлено через 55 секунд
Цитата Сообщение от silent Посмотреть сообщение
void destructor(struct pupil &A)
а нормальный деструктор не судьба сделать?
0
silent
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
17.05.2014, 23:16  [ТС] #3
Цитата Сообщение от Croessmah Посмотреть сообщение
delete [] name;
Не работает. Я даже не понимаю, почему это должно работать. Ведь в функцию мы передаем объект класса, а не просто указатель, чтобы можно было обращаться к нему напрямую
Цитата Сообщение от Croessmah Посмотреть сообщение
а нормальный деструктор не судьба сделать?
В задании сказано написать именно отдельные функции в виде конструктора и деструктора.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.05.2014, 23:19 #4
Цитата Сообщение от 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
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,401
Записей в блоге: 3
Завершенные тесты: 1
17.05.2014, 23:25 #5
Цитата Сообщение от Tulosba Посмотреть сообщение
Для конструктора/деструктора в C++ предусмотрен специальный синтаксис.
Ну а коли данимическая память, то еще конструктор копий и оператор присванивания, ну а раз уж C++11, то и возможность перемещать бы не помешала.
Цитата Сообщение от silent Посмотреть сообщение
Ведь в функцию мы передаем объект класса, а не просто указатель, чтобы можно было обращаться к нему напрямую
Будет возможно, если будет нормальный деструктор. И вообще акцент делался на то, что если выделяли память с помощью new[] то у освобождать нужно с помощью delete[], а не delete.
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот и пошли говнокоды на C++11
Ну так всегда же были
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.05.2014, 23:38 #6
Цитата Сообщение от Croessmah Посмотреть сообщение
данимическая память
динамитническая
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну так всегда же были
В данном случае без 11 стандарта не собралось бы просто.
0
silent
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
17.05.2014, 23:39  [ТС] #7
Цитата Сообщение от Tulosba Посмотреть сообщение
Для конструктора/деструктора в C++ предусмотрен специальный синтаксис.
В предыдущем сообщении я уже написал что нужно написать конструктор и деструктор в отдельной функции, вне структуры, в задании так сказано. На саму постановку задания, увы, я повлиять никак не могу: какое есть - такое и есть.

Цитата Сообщение от Tulosba Посмотреть сообщение
Скорее всего именно это и имелось в виду.
Имелось в виду, что
Цитата Сообщение от silent Посмотреть сообщение
Нужно в отдельной функции очистить память, выделенную под name.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
17.05.2014, 23:41 #8
Цитата Сообщение от silent Посмотреть сообщение
нужно написать конструктор и деструктор в отдельной функции, вне структуры, в задании так сказано.
Вне? Если Вам задают такие задания - меняйте препода как можно скорее.
0
silent
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
17.05.2014, 23:47  [ТС] #9
Цитата Сообщение от Tulosba Посмотреть сообщение
Вне? Если Вам задают такие задания - меняйте препода как можно скорее.
Это уже другая тема. Мы немного отклонились от сути, можно что-то поконкретнее по моему вопросу?
0
monolit
185 / 184 / 22
Регистрация: 24.03.2011
Сообщений: 667
Завершенные тесты: 1
18.05.2014, 00:21 #10
Цитата Сообщение от silent Посмотреть сообщение
void destructor(struct pupil &A)
Я один не понимаю, зачем тут struct? Или ставилась цель использовать как можно больше 'технологий' - тут и С, и С++ 11...
А по теме: как удалить, вам уже сказали. Единственное - вы Constructor не привели здесь. Хз че там делается внутри, мб поэтому и косяки.
Вот это, кстати, не дословная инструкция, а пример:
Цитата Сообщение от silent Посмотреть сообщение
delete [] name;
В вашем случае будет
C++
1
delete[] A.name;
Но даже неполное удаление такой ошибки вроде вызвать не могло (если там не происходит что-то еще).
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
18.05.2014, 00:53 #11
Цитата Сообщение от silent Посмотреть сообщение
Мы немного отклонились от сути, можно что-то поконкретнее по моему вопросу?
Конкретнее уже сказано. Должны быть нормальные конструктор и деструктор. Потакать желаниям Вашего препода или неправильно понятому заданию я не буду.
0
Croessmah
Эксперт CЭксперт С++
13214 / 7485 / 843
Регистрация: 27.09.2012
Сообщений: 18,401
Записей в блоге: 3
Завершенные тесты: 1
18.05.2014, 00:54 #12
Цитата Сообщение от 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
Tulosba
18.05.2014, 01:05
  #13

Не по теме:

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

0
silent
0 / 0 / 0
Регистрация: 11.05.2014
Сообщений: 5
18.05.2014, 12:20  [ТС] #14
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2014, 12:20
Привет! Вот еще темы с ответами:

Как правильно удалять выделенную память под указатель на указатель? - C++
есть код #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; using namespace std; void sort_1(const...

Удалить динамически выделенную память - C++
Получится ли освободить динамически выделенную память в интерфейсе одного класса, в интерфейсе другого класса, с условием что я использую...

Запись в динамически выделенную память - C++
Во общем, в dll выделяется память под char *, через new. Требуется в другой программе в которой я подключаю эту дллку переписать эти данные...

Сырой указатель на память выделенную через new[] - C++
Добрый вечер, подскажите правильную перегрузку для указателя на память выделенную через new #include &lt;iostream&gt; using namespace...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.05.2014, 12:20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru