2016-12-16 4 views
0

Ich hatte einen Fehler, der vor kurzem gelöst wurde, aber ich möchte verstehen, warum. Ich habe ein Cmake-Projekt mit C++ 11.Warum kann der Zeiger auf ein Objekt nur einmal funktionieren?

Dies funktioniert auf Mac OSX aber nicht auf Ubuntu. Es gibt null auf Ubuntu zurück.

obj *getPointer(){ 
    obj test = obj(1,2,3); 
    return &test; 
} 

Dies funktioniert auf beiden:

obj *getPointer(){ 
    obj* ptr; 
    obj test = obj(1,2,3); 
    ptr = &test 
    return &ptr; 
} 
+0

Sie sollten Warnung als Fehler aktivieren und sehen, dass es nicht kompiliert. –

Antwort

11

Ihre beiden Instanzen nicht definiertes Verhalten (UB) aufrufen, wie Sie die Adresse eines lokalen Objekt obj test mit automatic storage duration zurückkehren, die am Ausgang zerstört wird von der Funktion, so dass Sie mit einem baumelnden Zeiger enden. Es passiert einfach "zu", aber alles kann passieren, also solltest du UB um jeden Preis meiden!

Um zu verstehen, warum es funktioniert, liegt das daran, dass der Stapel der Funktion wahrscheinlich beim Beenden der Funktion vom Betriebssystem noch nicht zurückgeholt wurde, sodass der ungeordnete Zeiger auf dieselben Daten zeigt.

This answer zu Can a local variable's memory be accessed outside its scope? bietet eine der besten Erklärungen, die ich je über dangling Zeiger gesehen habe.

+0

Was ist der richtige Weg? Soll ich den Test obj von Anruferfunktion wie main übergeben? Oder soll ich Objekt mit neuem Schlüssel erstellen und löschen, wenn alles in einer anderen Funktion erledigt ist? – Nick

+1

@Nick Sie sollten es mit 'new' erstellen und mit' delete' freigeben. Oder besser, verwenden Sie [Smartpointer] (https://en.wikipedia.org/wiki/Smart_pointer). – vsoftco

+3

@Nick Ich denke, Sie sollten es nach Wert zurückgeben und lassen Sie den Compiler die Kopie elide. –

Verwandte Themen