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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
#1

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

23.08.2012, 01:21. Просмотров 1169. Ответов 10
Метки нет (Все метки)

Всем привет. Возник следующий вопрос:
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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2012, 01:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическая память. Функции. Массивы .Объекты (C++):

Динамическая память массивы - C++
В моем примере создаются 4 массива, в arr2 и arr3 сохраняются результаты совпадений/ не совпадений соответственно. new int создает массив...

Динамическая память и массивы - C++
Всем доброе утро . Решил по практиковаться и задался вопросом у меня есть массив a; как ему динамическую память выделить? как понял...

Многомерные массивы и динамическая память - C++
Всем привет! Как в С++ динамически выделить двухмерный массив с заданными размерностями, при этом я не хочу использовать доисторический...

Массивы и указатели. Динамическая память - C++
Нужно вывести на экран максимальные элементы в каждом столбце двумерного массива (матрицы). Решить с помощью указателей. Ошибка...

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

Структуры, функции и динамическая память - C++
Ребят, что-то я не понимаю, где я ошибся... Бошка уже не варит самому додуматься, так что прошу помощи :cry: #include<conio.h> ...

10
D-Vampire
3 / 3 / 0
Регистрация: 16.05.2012
Сообщений: 36
23.08.2012, 01:23 #2
Первый вариант лучше, т.к. не будет утечки. Правда почему *this не вернуть?
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2012, 01:24 #3
Цитата Сообщение от bgm313 Посмотреть сообщение
Так вот,является ли следующий код корректным?
является

Цитата Сообщение от bgm313 Посмотреть сообщение
или надо было сделать так:
утечка
1
alsav22
5421 / 4816 / 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;
}
1
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. выделить память динамически, то можно ли её будет как-то освободить при выходе из функции?
0
alsav22
5421 / 4816 / 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, сохраняется до окончания работы программы, в отличие от памяти для локальных переменных, создаваемых в функции.
1
bgm313
12 / 12 / 2
Регистрация: 27.07.2012
Сообщений: 208
23.08.2012, 02:18  [ТС] #7
Цитата Сообщение от alsav22 Посмотреть сообщение
Можно. В функции сделайте:
C++
1
delete temp;
Имелось в виду, после того как вернётся значение, т.е. освободить эту память вне функции?
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2012, 02:29 #8
Например, сам указатель temp это локальная переменная, память под которой объявляется свободной при выходе из функции. То, на что temp указывает (MyClass *temp = new MyClass(), создано в динамической области памяти и будет существовать (если delete не сделать) до окончания программы.

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

Добавлено через 6 минут
Например, вы в функции создаёте строку в динамической памяти. Функция возвращает указатель на эту память. При выходе из функции сохраняете этот указатель. Дальше работаете, с помощью этого указателя, со строкой в динамической памяти. Когда строка перестанет быть нужной, освобождаете память под ней с помощью delete.
0
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;
}
Правильно ли я понял, эта функция некорректная, т.к. надо под локальную переменную выделять динамически память?
0
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 *)на первый элемент локального массива который будет уничтожен по выходе из функции
Указатель (да и ссылка) - это не сам объект, это именно указатель на этот объект, а не этот объект
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.08.2012, 03:51 #11
Цитата Сообщение от bgm313 Посмотреть сообщение
надо под локальную переменную выделять динамически память?
Слово "надо" тут не подходит. Всё зависит от того, что нужно получить. Сформулируйте то, что вы хотите получить, и тогда можно ответить на этот вопрос.

Добавлено через 5 минут
Переменная переменной рознь. Массив - это особый случай. Имя массива, когда оно передаётся в функцию, или когда возвращается из функции, преобразуется в указатель на начало массива (если это имя переменной-не массива, то создаётся копия), и этот момент надо учитывать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2012, 03:51
Привет! Вот еще темы с ответами:

Шаблон функции, принимающей обычные массивы и объекты - C++
Нужно чтобы функция одинаково хорошо принимала массив long и объект vector <string>, чтобы затем удалить повторяющиеся элементы,...

Статическая память,Динамическая память. - C++
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

Динамическая память с++ - C++
Как использовать динамическую память в с++

Динамическая память - C++
Есть 2 массива одной размерности: int *m1 = new int , *m2 = new int ; где N, M некие числа. Собственно вопрос: как...


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

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

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