2009-04-21 4 views
7

Я не уверен, что это неправильно с этим (имейте в виду, я любопытное Сорта новичок в C++)возвращает указатель класса из функции

У меня есть этот класс:

Foo 
{ 
    string name; 
    public: 
    SetName(string); 
} 
string Foo::SetName(string name) 
{ 
    this->name = name; 
    return this->name; 
}; 
////////////////////////////////////////////// 
//This is where I am trying to return a Foo pointer from this global function: 

Foo * ReturnFooPointer() 
{ 
    Foo foo; 
    Foo * foo_ptr; 
    foo_ptr = &foo; 
    return foo_ptr; 
} 

во время компиляции , это компилируется просто отлично. Однако во время выполнения он выдает исключение во время выполнения (некоторая ошибка доступа)

Что я делаю неправильно?

+1

Этот код не может быть скомпилирован. В Foo отсутствует ключевое слово класса. –

ответ

19

Вместо этого вам нужно использовать новое ключевое слово, чтобы создать новый Foo в куче.
Объект в стеке будет освобожден, когда функция закончится, поэтому вы возвращаете указатель на недопустимое место в памяти.

Вот правильный код.

Foo * ReturnFooPointer() 
{ 
    Foo * foo_ptr = new Foo(); 
    return foo_ptr; 
} 

Запомните позже, чтобы удалить указатель, который вы возвращаете.

Так позже в коде:

Foo *pFoo = ReturnFooPointer(); 
//Use pFoo 
//... 
delete pFoo; 
+0

У меня есть один маленький вопрос, чтобы убедиться. У переменной foo_ptr все еще есть автоматическое хранилище, верно? Я имею в виду, что память, на которую она указана, по-прежнему остается до тех пор, пока она не будет удалена 'delete', но сама переменная удаляется после того, как она выйдет из области (функции). – zgulser

5

Вы возвращающая указатель на локальный объект в стеке. Он выходит за пределы области действия, когда функция возвращается, и недействительна.

Вы должны создать новый экземпляр для возврата, т.е.

Foo* foo_ptr = new Foo(); 

Это создаст объект в куче и будет жить, пока вы не вызовете delete на нем.

1

фактический объект выделяется в стеке, поэтому он уничтожается, когда он выходит из области видимости (когда функция возвращается). Если вы разместите его на куче (с new), он будет жив, пока вы не достигнете delete.

Смежные вопросы