2016-04-19 2 views
-4

Очевидно, я предпочел бы использовать std::shared_ptr<T> или std::unique_ptr<T>, но я имею дело с некоторым устаревшим кодом от 98/03.Что произойдет, если я верну указатель?

Моя ситуация:

auto* SomeClass::ReturnPtr(void) 
{ 
    return this -> UniquePtrObject.get(); 
}; 

Что произойдет, если я делаю:

SomeObject.ReturnPtr() -> SomeFunction(); 

ли временный указатель получить автоматически удаляются? Или я действительно причиняю утечку?

Это заставляет меня думать о выражении, как Rvalue pointer. Указатели Rvalue не имеют смысла, не так ли?

+7

Код устаревшего типа с возвратом типа 'auto *'? – Steephen

+0

Какой «временной указатель» вы говорите? Вы просто возвращаете указатель. Поведение этого не изменилось. –

+2

В дополнение к комментариям выше, просто заметьте, пожалуйста, не используйте пробелы до и после '->' или '.' – Nacho

ответ

2

С

auto* SomeClass::ReturnPtr() 
{ 
    return this->UniquePtrObject.get(); 
} 

Ваш указатель является действительным до тех пор, как UniquePtrObject является (или любой reset делается на нем).

Так что SomeObject.ReturnPtr()->SomeFunction() действительно.

Но после сделаем оборванный указатель:

auto* createDanglingPointer() 
{ 
    SomeClass SomeObject = MakeSomeClass(); 

    return SomeObject.ReturnPtr(); 
} 

в жизни SomeObject заканчивается в конце области.

+0

Спасибо, что ответили. Приветствия. –

-2

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

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