Возврат указателя из функции-члена в C ++ - PullRequest
1 голос
/ 12 октября 2010

Здравствуйте, у меня есть класс с функцией, которая возвращает указатель:

int* Maze::GetStart()
{
    int startNode = 1;

    return &startNode;
}

Будет ли удалено значение startNode после того, как функция вернет указатель?

Если бы я сделал это вместо этого, было бы сохранено значение?

int Maze::GetStart()
{
    int startNode = 1;

    return startNode ;
}

main
{
    int* pStart = maze.GetStart();
}

Ответы [ 2 ]

4 голосов
/ 12 октября 2010

Будет ли удалено значение startNode после того, как функция вернет указатель?

Переменная startNode прекратит свое существование после возврата из функции GetStart(), поэтому в этом смысле, да.

Но , ваш код открывает огромную возможность для неопределенного поведения, возвращая адреса тем вещам, которые исчезнут после возврата GetStart().Если вызывающая сторона пытается разыменовать возвращенный node*, может произойти все что угодно.Кроме того, код не может быть скомпилирован как есть, так как вы не можете неявно привести int* к node*.

Однако, если вы возвращаете по значению, то все будет в порядке.:

int Maze::GetStart() 
{ 
    int startNode = 1; 
    return startNode; 
    // return 1; // Why not do this?
} 

int pStart = maze.GetStart(); // Get returned value as int, not pointer to int. 
1 голос
/ 12 октября 2010

Возвращение адреса переменной, размещенной в стеке, вообще не имеет смысла. Время жизни переменной startNode истекает, как только функция GetStart() возвращается. Не имеет значения, является ли это свободная функция или функция-член.

Я думаю, в gcc / g ++ есть предупреждение для этого.

Основано на редактировании вопроса:

Если вы хотите изменить переменную и сохранить измененное состояние , тогда оно должно быть объявлено static. См статические локальные переменные .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...