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

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

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

Возвращение из функции динамически созданного объекта - C++

05.07.2014, 01:46. Просмотров 302. Ответов 5
Метки нет (Все метки)

Доброго всем времени суток! Столкнулся с такой проблемой. Необходимо создать список, при этом использоваться список планируется внутри main, а формироваться он должен внутри другой функции. Код ниже:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// условно: узел списка
class TProc {
public:
    int i;
    TProc* next;
};
 
// условно: функция, формирующая список
void graphing(TProc* head)
{
    // фрагмент функции
    TProc* temp = new TProc;    // веделение памяти при создании нового узла
    temp->i = 1;
    temp->next = NULL;
    head = temp;    // теперь head и temp указывают на одну область
}       // А здесь, как я понимаю, выделенная память освобождается
 
int main ( )
{   setlocale (LC_CTYPE, "rus");
 
    TProc* head = NULL;
    graphing(head);
    cout << head->i;    // при попытке обращения к элементу - программа крашится
                           // я предполагаю из-за того, что выделенная внутри graphing память была освобождена
    return 0;
}
Судя по всему, при завершении функции graphing происходит освобождение всей выделенной внутри нее памяти. Это нормальная ситуация? Что-то подсказывает, что так быть не должно, я ведь delete не использовал.

Избежать ошибки можно, если:
C++
1
TProc* head;
объявить глобальной. Но такой вариант для меня не подходит. Скажите, как можно избежать ошибки, чтобы при этом head по-прежнему передавался graphing?? Существует ли вообще такой способ? Спасибо.
UPD: компилятор gcc.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2014, 01:46
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возвращение из функции динамически созданного объекта (C++):

Как обращаться к методу динамически созданного объекта? - C++
Тоесть как правильно: string *str = new string(); *str-&gt;size(); // или str-&gt;size();

Возвращение объекта из функции - C++
Почему при возврате объекта из функции этот объект вызывает копирующий конструктор? Почему вообще происходит копирование и что куда...

Расширение динамически созданного массива объектов - C++
Здравствуйте! Подскажите, как расширить динамический массив без использования STL библиотеки: count = 10; ClassA** A; A =...

Возвращение пустого объекта. - C++
Описан метод поиска структуры по заданным параметрам, который, в случае нахождения этой структуры, в базе данных, возвращает ее в качестве...

Возвращение функцией объекта - C++
Здравствуйте. Это пример из книжки. #include &lt;iostream&gt; using namespace std; class MyClass { int val; public: MyClass(int...

Возвращение временного объекта из метода - C++
Доброго времени суток,господа! Сразу к делу: Имеется следующий код: struct Test { int a; //Lets just exist Test(){}...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Jewbacabra
Эксперт PHP
2413 / 2009 / 760
Регистрация: 24.04.2014
Сообщений: 5,887
05.07.2014, 01:56 #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Kency, head в 22 строчке, которая передается в функцию graphing, и head который параметр функции это разные переменные, и изменяя head внутри функции graphing, head объявленный внутри main не меняется.

чтобы решить эту проблему нужно передавать ссылку или указатель, например так:
C++
1
void graphing(TProc* & head)
DrOffset
7092 / 4233 / 950
Регистрация: 30.01.2014
Сообщений: 7,008
05.07.2014, 04:11 #3
Цитата Сообщение от Kency Посмотреть сообщение
А здесь, как я понимаю, выделенная память освобождается
Нет. Не освобождается.
Цитата Сообщение от Kency Посмотреть сообщение
Судя по всему, при завершении функции graphing происходит освобождение всей выделенной внутри нее памяти. Это нормальная ситуация? Что-то подсказывает, что так быть не должно, я ведь delete не использовал.
Как уже сказали, в функцию ушла копию указателя из main - head. Либо ссылка на указатель, либо указатель на указатель нужно использовать, чтобы получить измененный указатель через параметр. Либо, что более правильно, использовать возврат значения:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
TProc * graphing()
{
    TProc* temp = new TProc;
    temp->i = 1;
    temp->next = NULL;
    return temp;
} 
 
int main()
{   setlocale (LC_CTYPE, "rus");
 
    TProc* head = graphing();
    cout << head->i; 
}
PS. для инициализации полей лучше использовать конструкторы.
РустамКР
5 / 5 / 2
Регистрация: 02.02.2014
Сообщений: 77
05.07.2014, 08:56 #4
Вы вроде неправильно создаете член TProc *next класса TProc.
Так не пробывали:
C++
1
2
3
4
5
6
7
class NProc{
};
class TProc {
public:
    int i;
    NProc* next;
};
zss
Модератор
Эксперт С++
6360 / 5924 / 1921
Регистрация: 18.12.2011
Сообщений: 15,228
Завершенные тесты: 1
05.07.2014, 09:42 #5
РустамКР, Списки организуются именно таким способом:
Каждый экземпляр класса кроме данных содержит адрес следующего экземпляра
ТАКОГО ЖЕ класса.
Kency
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 12
05.07.2014, 09:43  [ТС] #6
Jewbacabra, DrOffset, спасибо, разобрался. Оба варианта решают проблему на ура)
Конструкторы не стал описывать для краткости примера.
РустамКР, нет, здесь все верно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.07.2014, 09:43
Привет! Вот еще темы с ответами:

Возвращение объекта класса из i-го элемента массива - C++
Доброго времени суток! Помогите, пожалуйста, с выполнением задания лаб. работы. Необходимо написать функцию, которая б возвращала...

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

Почему работают методы явно не созданного объекта - C++
Привет. Беглый поиск не дал ответа на вопрос, почему работает нижеприведённый код: class SomeClass { public: ...

Вывод объекта класса созданного пользователем на консоль объектом cout - C++
Доброго времени суток ребят. Возникла задача вывести объект класса созданного пользователем на консоль с помощью объекта cout. Но так как я...


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

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

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