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

Динамическая память. Функции. Массивы .Объекты - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
23.08.2012, 01:21     Динамическая память. Функции. Массивы .Объекты #1
Всем привет. Возник следующий вопрос:
1.Когда в c++ из функции возвращается объект (экземпляр какого-то класса), то насколько мне известно, создается временный объект, для хранения результат и последующего его возврата.
Так вот,является ли следующий код корректным?
C++
1
2
3
4
5
MyClass MyClass::func(){
  MyClass temp;
  ...
  return temp;
}
или надо было сделать так:

C++
1
2
3
4
5
MyClass MyClass::func(){
  MyClass *temp = new MyClass();
  ...
  return *temp;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 01:21     Динамическая память. Функции. Массивы .Объекты
Посмотрите здесь:

C++ Динамическая память
C++ Динамическая память
Статическая память,Динамическая память. C++
C++ Указатели,массивы символов и динамическая память
Динамическая память и массивы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
D-Vampire
3 / 3 / 0
Регистрация: 16.05.2012
Сообщений: 36
23.08.2012, 01:23     Динамическая память. Функции. Массивы .Объекты #2
Первый вариант лучше, т.к. не будет утечки. Правда почему *this не вернуть?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2012, 01:24     Динамическая память. Функции. Массивы .Объекты #3
Цитата Сообщение от bgm313 Посмотреть сообщение
Так вот,является ли следующий код корректным?
является

Цитата Сообщение от bgm313 Посмотреть сообщение
или надо было сделать так:
утечка
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2012, 01:29     Динамическая память. Функции. Массивы .Объекты #4
Во втором случае, можно возвратить просто temp и сохранить его значение.
C++
1
2
3
4
5
MyClass* MyClass::func(){
  MyClass *temp = new MyClass();
  ...
  return temp;
}
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
23.08.2012, 01:42  [ТС]     Динамическая память. Функции. Массивы .Объекты #5
Цитата Сообщение от Jupiter Посмотреть сообщение
является


утечка
1.Скажите пожалуйста с чем, связана эта утечка?
2.Если есть какая-либо функция, которая возвращает массив, например строку,причём строка объявляется внутри функции (строка не статическая), то для этой строки также создаётся временный объект или нет.

Как сказал преподаватель следующий код не верен:

C++
1
2
3
4
5
char * func(){
 char result[80];
 ...
 return result;
}
так как, строка будет уничтожена и поэтому надо всегда в таких ситуациях выделять память динамически так ли это?
3.Если в 2. выделить память динамически, то можно ли её будет как-то освободить при выходе из функции?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2012, 02:06     Динамическая память. Функции. Массивы .Объекты #6
Цитата Сообщение от bgm313 Посмотреть сообщение
можно ли её будет как-то освободить при выходе из функции?
Можно. В функции сделайте:
C++
1
delete temp;
Если объект, созданный в функции при помощи new MyClass(), при выходе из функции вам больше не понадобится. Если понадобится, то читайте мой предыдущий пост. Для примера:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int* func()
{
 int *temp = new int;
 ...
 return temp;
}
 
int main()
{
   ...
   int *p;
   p = func(); // сохраняете значение указателя на объект.
   ...
   delete p; // объект больше не нужен.
  ...
Добавлено через 10 минут
Цитата Сообщение от bgm313 Посмотреть сообщение
1.Скажите пожалуйста с чем, связана эта утечка?
С тем, что в функции выделяется динамическая память, а указатель на неё не сохраняется, и поэтому теряется возможность её в дальнейшем освободить. Память, выделяемая при помощи new, если её не освободить при помощи delete, сохраняется до окончания работы программы, в отличие от памяти для локальных переменных, создаваемых в функции.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
23.08.2012, 02:18  [ТС]     Динамическая память. Функции. Массивы .Объекты #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Можно. В функции сделайте:
C++
1
delete temp;
Имелось в виду, после того как вернётся значение, т.е. освободить эту память вне функции?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2012, 02:29     Динамическая память. Функции. Массивы .Объекты #8
Например, сам указатель temp это локальная переменная, память под которой объявляется свободной при выходе из функции. То, на что temp указывает (MyClass *temp = new MyClass(), создано в динамической области памяти и будет существовать (если delete не сделать) до окончания программы.

Добавлено через 2 минуты
Цитата Сообщение от bgm313 Посмотреть сообщение
освободить эту память вне функции?
Да. Когда объект перестанет быть нужным.

Добавлено через 6 минут
Например, вы в функции создаёте строку в динамической памяти. Функция возвращает указатель на эту память. При выходе из функции сохраняете этот указатель. Дальше работаете, с помощью этого указателя, со строкой в динамической памяти. Когда строка перестанет быть нужной, освобождаете память под ней с помощью delete.
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
23.08.2012, 02:52  [ТС]     Динамическая память. Функции. Массивы .Объекты #9
А вот например такая функция:

C++
1
2
3
4
5
 int f(int a){
     int new_a = a*a;
     
   return new_a;
}
Правильно ли я понял, эта функция некорректная, т.к. надо под локальную переменную выделять динамически память?
warchief
 Аватар для warchief
36 / 36 / 3
Регистрация: 09.08.2012
Сообщений: 114
23.08.2012, 03:05     Динамическая память. Функции. Массивы .Объекты #10
Цитата Сообщение от bgm313 Посмотреть сообщение
Правильно ли я понял, эта функция некорректная, т.к. надо под локальную переменную выделять динамически память?
нет, эта функция кооректа, потому что будет создана копия. а вот если бы она такой:
C++
1
2
3
4
5
int& f(int a){
     int new_a = a*a;
     
   return new_a;
}
или такой:
C++
1
2
3
4
5
int* f(int a){
     int new_a = a*a;
     
   return &new_a;
}
вы бы получили ошибку. о чем и говорит вам ваш преподаватель в примере про char. Потому что здесь вы возращаете не объект а указатель/ссылку на локальную переменную, которая на тот момент будет уничтожена. А в вашем примере вы возвращаете именно копию объекта, и не важно, что случилось с оригиналом, работать вы будете уже с его копией.

Добавлено через 4 минуты
Цитата Сообщение от bgm313 Посмотреть сообщение
2.Если есть какая-либо функция, которая возвращает массив, например строку,причём строка объявляется внутри функции (строка не статическая), то для этой строки также создаётся временный объект или нет.
Как сказал преподаватель следующий код не верен:
C++
1
2
3
4
5
char * func(){
 char result[80];
 ...
 return result;
}
так как, строка будет уничтожена и поэтому надо всегда в таких ситуациях выделять память динамически так ли это?
То есть, ваш преподаватель прав. вы возвращаете не копию массива, а указатель о чем и говорит (char *)на первый элемент локального массива который будет уничтожен по выходе из функции
Указатель (да и ссылка) - это не сам объект, это именно указатель на этот объект, а не этот объект
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2012, 03:51     Динамическая память. Функции. Массивы .Объекты
Еще ссылки по теме:

Шаблон функции, принимающей обычные массивы и объекты C++
Структуры, функции и динамическая память C++
Массивы и указатели. Динамическая память C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2012, 03:51     Динамическая память. Функции. Массивы .Объекты #11
Цитата Сообщение от bgm313 Посмотреть сообщение
надо под локальную переменную выделять динамически память?
Слово "надо" тут не подходит. Всё зависит от того, что нужно получить. Сформулируйте то, что вы хотите получить, и тогда можно ответить на этот вопрос.

Добавлено через 5 минут
Переменная переменной рознь. Массив - это особый случай. Имя массива, когда оно передаётся в функцию, или когда возвращается из функции, преобразуется в указатель на начало массива (если это имя переменной-не массива, то создаётся копия), и этот момент надо учитывать.
Yandex
Объявления
23.08.2012, 03:51     Динамическая память. Функции. Массивы .Объекты
Ответ Создать тему
Опции темы

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