Rückgabe von Zeigern oder Referenzen von Funktionen C ++

7

Wenn Sie eine Instanz von einer Methode zurückgeben wollen, erstellen Sie das Objekt und senden einen Zeiger zurück oder eine Referenz zurück? Was ist die richtige Methode und die Methodensignatur dafür?

    
stephen 20.08.2010, 20:11
quelle

6 Antworten

8

Es gibt viele Möglichkeiten, dies in C ++ zu tun. Leider führen die meisten zu Verwirrung darüber, wer für das Zuweisen und Freigeben des Objekts zuständig ist. Es gibt zwei Methoden, die ich empfehle:

%Vor%     
Anders Abel 20.08.2010 20:15
quelle
6

Entweder gibt es einen Wert zurück (Leute nehmen fälschlicherweise an, dass dies langsam ist) oder, wenn Sie eine Überschreibung eines polymorphen Typs zurückgeben, geben Sie auto_ptr (oder besser unique_ptr in C ++ 0x) zurück.

Der Grund, warum Sie KEINE shared_ptr verwenden, ist, dass Sie Ihren Zeiger niemals daraus entfernen können und eine andere Semantik für die Eigentümerschaft verwenden können.

Niemals einen Verweis auf eine lokale Instanz zurückgeben.

    
Crazy Eddie 20.08.2010 20:29
quelle
6

Die Antwort hängt davon ab, was genau Sie tun und wer für die Freigabe verantwortlich ist.

Erste Methode: Zuweisung auf dem Heap und Rückgabe. Wer immer die Funktion aufgerufen hat, wird dafür verantwortlich sein, den zurückgegebenen Zeiger zu löschen.

%Vor%

Dann in einer anderen Funktion

%Vor%

Zweite Methode: Gibt eine Referenz zurück. Sie müssen darauf achten, dass Sie den Gültigkeitsbereich nicht verlassen, indem Sie lokale oder temporäre Variablen zurückgeben.

Tu das nicht:

%Vor%

Sie können Referenzen auf Elementvariablen oder Variablen zurückgeben, die als Argumente an die Funktion übergeben wurden.

%Vor%     
crazyx 20.08.2010 20:52
quelle
4

Wenn ich eine Instanz rein zur Rückgabe erstelle, würde ich nach Wert als erste Präferenz zurückgeben.

Nur wenn der Objekttyp nicht praktisch kopierbar ist, würde ich über einen intelligenten Zeiger, der die Übertragung des Besitzes einkapselt, zurückkommen.

Zurückgeben eines Verweises, den ich reserviere, um einen Verweis auf ein Objekt zurückzugeben, dessen Besitz nicht aus der Funktion übertragen wird, das heißt, es gehört bereits etwas anderem und seine Existenz ist bis zu einer definierten Zeit nach der Rückkehr der Funktion garantiert.

    
Charles Bailey 20.08.2010 20:16
quelle
2

Wenn Sie sich auf etwas wie eine Factory-Methode beziehen, geben Sie normalerweise einen Zeiger zurück. Besser noch, geben Sie einen Smart Pointer zurück, und Sie erzeugen nicht mehr Lecks, indem Sie einen rohen Zeiger verwenden.

Beispiel:

%Vor%     
John Dibling 20.08.2010 20:16
quelle
0

Dies hängt wirklich vom Umfang Ihrer Instanz ab, die die Lebensdauer der Instanz steuert. Wenn es sich um eine lokale Instanz handelt, können Sie den Wert zurückgeben, es fallen jedoch die Kosten für die Erstellung von & amp; Zerstören des Objekts zweimal (es sei denn, Sie verwenden RVO ). Die andere Option besteht darin, einen Zeiger zurückzugeben, indem das Objekt im Heap innerhalb der Funktion erstellt wird. Bei diesem Ansatz ist der Client jedoch dafür verantwortlich, den zugewiesenen Speicher zu löschen. ist immer anfällig für Speicherlecks. Aus diesem Grund müssen Sie einen intelligenten Zeiger verwenden. Der Code von Anders Abel veranschaulicht die obigen beiden Ansätze anhand von Codebeispielen. Übrigens, Sie können keinen Verweis auf eine lokale Instanz zurückgeben, da die Instanz nach Beendigung der Funktion nicht mehr gültig ist.

    
naivnomore 20.08.2010 20:34
quelle

Tags und Links