2016-04-19 11 views
-4

Offensichtlich würde ich lieber std::shared_ptr<T> oder std::unique_ptr<T> verwenden, aber ich habe mit etwas Legacy-Code von 98/03 zu tun.Was passiert, wenn ich einen Zeiger zurückgebe?

Meine Situation ist:

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

Was passiert, wenn ich tun:

SomeObject.ReturnPtr() -> SomeFunction(); 

Hat der temporäre Zeiger automatisch gelöscht werden? Oder verursache ich tatsächlich ein Leck?

Das lässt mich an einen Ausdruck wie Rvalue Zeiger denken. Rvalue-Zeiger ergeben keinen Sinn, oder?

+7

Legacy-Code mit Rückgabetyp als 'auto *'? – Steephen

+0

Worüber "temporärer Zeiger" sprichst du? Sie geben nur einen Zeiger zurück. Das Verhalten änderte sich nicht. –

+2

Oben auf den Kommentaren, nur eine Notiz, bitte verwenden Sie keine Leerzeichen vor und nach '->' oder '.' – Nacho

Antwort

2

Mit

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

Ihr Zeiger gültig ist, solange UniquePtrObject ist (oder jede reset auf es getan).

Also SomeObject.ReturnPtr()->SomeFunction() ist gültig.

Aber folgenden wird baumelnden Zeiger machen:

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

    return SomeObject.ReturnPtr(); 
} 

als someobject Lebenszeit endet am Ende des Umfangs.

+0

Danke für die Antwort. Prost. –

-2

Temporäre Zeiger sind sehr gefährlich. Immer wenn der Umfang der Daten, auf die er hinweist, endet, wird er freigegeben, so dass der Zeiger unruhig wird und versuchen wird, auf irgendeinen zufälligen Ort zuzugreifen, für den das Programm keinen Zugriff hat. Es kann zu falschen Ergebnissen führen, Werte oder Programme können mit Ausnahme von illegalem Zugriff beendet werden.

Verwandte Themen