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

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

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

Оператор new внутри функции - C++

17.03.2013, 11:40. Просмотров 457. Ответов 4
Метки нет (Все метки)

В книжках обычно пишут, что код типа

C
1
2
3
4
int*  f_bad ( ){
        int а = 5;
        return &а; / / нельзя!
}
неверен, так как локальная переменная исчезает после выхода из функции и указатель на нее возвращать бессмысленно. Но вот такой код выводит же правильный ответ (то есть 6):

C
1
2
3
4
5
6
int main () {
    int *k;
    k=f_bad(6);
    cout << "k= " << *k << endl;
    return 0;
}
Тогда в чем ошибка?

И второй вопрос: корректна ли функция вроде
C
1
2
3
4
5
int* func(int j) {
    int* a=new int;
    *a=j;
    return a;
}
Она тоже "работает":
C
1
2
3
4
5
6
int main () {
    int *k;
    k=func(5);
    cout << "k= " << *k << endl;
    return 0;
}
выводит 5 как и ожидается.

Почему? Ведь "а" же локальная переменная и после выхода из функции должна бы уничтожиться ...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2013, 11:40     Оператор new внутри функции
Посмотрите здесь:

C++ Функции и перегруженный оператор
C++ Объявление объекта внутри функции
C++ создание динамического массива внутри функции
Обращение к аргументу внутри функции C++
Define внутри макро-функции C++
Локальная переменная внутри статической функции C++
Не работает оператор return в рекурсивной функции C++
C++ Статический массив внутри функции
C++ Циклы внутри главной функции
C++ Отсутствует ";" при создании функции внутри другой функции
C++ Функции внутри цикла не выполняются
Вызвать функцию внутри другой функции C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
21.03.2013, 08:28     Оператор new внутри функции #2
Цитата Сообщение от hotpil Посмотреть сообщение
Но вот такой код выводит же правильный ответ
С точки зрения языка и компилятора на момент выхода из функции все её локальные переменные уничтожаются, перестают существовать. С точки зрения выполнения программы стек после возврата из функции никто не чистит, потому там вполне может остаться присвоенное значение, и код будет работать, как ожидалось. Но штука в том, что стек может и перезаписаться, и возвращено будет совсем другое значение. Код же, работающий по разному в зависимости от фазы луны, правильным назвать нельзя. Поэтому пишут совершенно правильно - по адресу, возвращённому из функции, в общем случае лежит неопределённое значение (мусор).
Цитата Сообщение от hotpil Посмотреть сообщение
Почему? Ведь "а" же локальная переменная и после выхода из функции должна бы уничтожиться ...
a - всего лишь указатель. Мы ведь не саму a возвращаем, а значение, которое в неё записано. А вот оно-то никуда не пропадёт, ведь память выделена динамически. Другой вопрос - память эту программист обязан собственноручно вернуть системе с помощью вызова free.
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
21.03.2013, 14:39     Оператор new внутри функции #3
Цитата Сообщение от hotpil Посмотреть сообщение
неверен, так как локальная переменная исчезает после выхода из функции и указатель на нее возвращать бессмысленно. Но вот такой код выводит же правильный ответ (то есть 6):

C++
1
2
3
4
5
6
int main () {
 int *k;
 k=f_bad(6);
 cout << "k= " << *k << endl;
 return 0;
}
Тогда в чем ошибка?
ошибка в том что ты возвращаешь указатель на память где лежала локальная переменная, и что там никому не ведомо, и если повезет(как в большинстве случаев и происходит) на место где была локальная переменная ничего не запишется,

Цитата Сообщение от hotpil Посмотреть сообщение
И второй вопрос: корректна ли функция вроде

C++
1
2
3
4
5
int* func(int j) {
 int* a=new int;
 *a=j;
 return a;
}
Она тоже "работает":
C++
1
2
3
4
5
6
int main () {
 int *k;
 k=func(5);
 cout << "k= " << *k << endl;
 return 0;
}
ты по указателю записал значение, и вернул указатель, по выходу из функции она вернет копию указателя и ты ее используешь, корректность поведения зависит от конкретного случая - надо ли тебе это или нет, но такие конструкции чреваты утечками памяти, ибо память никто не чистит
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 15:31     Оператор new внутри функции #4
Цитата Сообщение от hotpil Посмотреть сообщение
Но вот такой код выводит же правильный ответ (то есть 6):
Цитата Сообщение от hotpil Посмотреть сообщение
C++
1
2
3
4
5
6
int main () {
 int *k;
 k=f_bad(6);
 cout << "k= " << *k << endl;
 return 0;
}
А вот такой выведет уже неправильный:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
 
int* f_bad (int b)
{
    int а = b;
    return &а; // нельзя!
}
 
int main()
{
    int *k;
    k = f_bad(6);
    cout << "k= " << *k << endl;
    cout << "k= " << *k << endl;
    
    cin.get();
    return 0;
}
Миниатюры
Оператор new внутри функции  
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 15:39     Оператор new внутри функции #5
Цитата Сообщение от hotpil Посмотреть сообщение
И второй вопрос: корректна ли функция вроде
C++
1
2
3
4
5
6
7
8
9
10
11
12
int* func(int j) {
int* a=new int;
*a=j;
return a;
}
 
int main () {
    int *k;
    k=func(5);
    cout << "k= " << *k << endl;
    return 0;
}
Корректна, потому что значение, созданного в функции указателя сохраняется, и он указывает на область динамической памяти, данные в которой будут сохраняться до тех пор, пока эта память не будет освобождена (программистом или ОС). Только нужно следить за тем, чтобы не было утечки памяти.
Yandex
Объявления
21.03.2013, 15:39     Оператор new внутри функции
Ответ Создать тему
Опции темы

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