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

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

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

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

17.03.2013, 11:40. Просмотров 501. Ответов 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 как и ожидается.

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

Вызов функции внутри другой функции с передачей локальной переменной по ссылке - C++
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int &amp;ref){...

Динамическое выделение памяти внутри функции (что вернуть из функции, если не удалось выделить память?) - C++
такое дело, есть функция, которая выполняет некоторую операцию, функция при успешном выполнении должна вернуть 0, при ниудачном код...

Отсутствует ";" при создании функции внутри другой функции - C++
Приветствую. Есть код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int main() { double er(double...

Функции и перегруженный оператор - C++
Помогите реализовать на С++: 1.Определить пользовательский тип данных fraction (дробь), представляющий собой структуру из 2х полей:...

Преобразование функции в оператор - C++
Как преобразовать функцию объединения двух множеств в оператор класса? #include &lt;iostream&gt; #include &lt;vector&gt; #include &lt;algorithm&gt; ...

Рандом внутри функции - C++
Возник такой вот вопрос. Если я пишу следующие строки, то в мемо выводятся числа от одного до 10: for (int i = 0; i &lt; 10; i++) { ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
21.03.2013, 08:28 #2
Цитата Сообщение от hotpil Посмотреть сообщение
Но вот такой код выводит же правильный ответ
С точки зрения языка и компилятора на момент выхода из функции все её локальные переменные уничтожаются, перестают существовать. С точки зрения выполнения программы стек после возврата из функции никто не чистит, потому там вполне может остаться присвоенное значение, и код будет работать, как ожидалось. Но штука в том, что стек может и перезаписаться, и возвращено будет совсем другое значение. Код же, работающий по разному в зависимости от фазы луны, правильным назвать нельзя. Поэтому пишут совершенно правильно - по адресу, возвращённому из функции, в общем случае лежит неопределённое значение (мусор).
Цитата Сообщение от hotpil Посмотреть сообщение
Почему? Ведь "а" же локальная переменная и после выхода из функции должна бы уничтожиться ...
a - всего лишь указатель. Мы ведь не саму a возвращаем, а значение, которое в неё записано. А вот оно-то никуда не пропадёт, ведь память выделена динамически. Другой вопрос - память эту программист обязан собственноручно вернуть системе с помощью вызова free.
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
21.03.2013, 14:39 #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;
}
ты по указателю записал значение, и вернул указатель, по выходу из функции она вернет копию указателя и ты ее используешь, корректность поведения зависит от конкретного случая - надо ли тебе это или нет, но такие конструкции чреваты утечками памяти, ибо память никто не чистит
0
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 15:31 #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;
}
0
Миниатюры
Оператор new внутри функции  
alsav22
5419 / 4815 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.03.2013, 15:39 #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;
}
Корректна, потому что значение, созданного в функции указателя сохраняется, и он указывает на область динамической памяти, данные в которой будут сохраняться до тех пор, пока эта память не будет освобождена (программистом или ОС). Только нужно следить за тем, чтобы не было утечки памяти.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 15:39
Привет! Вот еще темы с ответами:

Статический массив внутри функции - C++
Требуется написать функцию - таблицу которая просто возвращает данные из статического массива по индексу. int GetFromTable(int...

Обращение к аргументу внутри функции - C++
void F(){ M=50; // тут пишет undefined symbol M. } void T(int *M){ F(); } int main{ int MASS;

Объявление объекта внутри функции - C++
Здраствуйте. У меня такой вопрос: есть класс class A { public: A(): p1(p2),p2(new int) { }

Функции внутри цикла не выполняются - C++
Здравствуйте! Почему-то не работают функции внутри цикла (конечное значение выходит такое, будто изменений переменных внутри цикла не...


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

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

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