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

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

Восстановить пароль Регистрация
 
Kency
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 12
05.07.2014, 01:46     Возвращение из функции динамически созданного объекта #1
Доброго всем времени суток! Столкнулся с такой проблемой. Необходимо создать список, при этом использоваться список планируется внутри 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)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jewbacabra
1791 / 1506 / 540
Регистрация: 24.04.2014
Сообщений: 4,231
05.07.2014, 01:56     Возвращение из функции динамически созданного объекта #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Kency, head в 22 строчке, которая передается в функцию graphing, и head который параметр функции это разные переменные, и изменяя head внутри функции graphing, head объявленный внутри main не меняется.

чтобы решить эту проблему нужно передавать ссылку или указатель, например так:
C++
1
void graphing(TProc* & head)
DrOffset
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
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. для инициализации полей лучше использовать конструкторы.
РустамКР
4 / 4 / 2
Регистрация: 02.02.2014
Сообщений: 65
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
Модератор
Эксперт С++
 Аватар для zss
5947 / 5552 / 1784
Регистрация: 18.12.2011
Сообщений: 14,184
Завершенные тесты: 1
05.07.2014, 09:42     Возвращение из функции динамически созданного объекта #5
РустамКР, Списки организуются именно таким способом:
Каждый экземпляр класса кроме данных содержит адрес следующего экземпляра
ТАКОГО ЖЕ класса.
Kency
0 / 0 / 0
Регистрация: 28.04.2014
Сообщений: 12
05.07.2014, 09:43  [ТС]     Возвращение из функции динамически созданного объекта #6
Jewbacabra, DrOffset, спасибо, разобрался. Оба варианта решают проблему на ура)
Конструкторы не стал описывать для краткости примера.
РустамКР, нет, здесь все верно.
Yandex
Объявления
05.07.2014, 09:43     Возвращение из функции динамически созданного объекта
Ответ Создать тему
Опции темы

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