2016-08-08 49 views
3

Ich codierte meine Funktion ist ordnungsgemäß einen Zeiger auf eine Referenz zurückgeben. Ich fand, dass, obwohl die Funktion zurückgab, was es tun sollte, std::cout die Ergebnisse änderte. Mache ich hier etwas falsch? Wie behebt man dieses Verhalten?Std :: Cout Ändern des Variablenwerts

Bitte lesen Sie den folgenden Code-Schnipsel,

#include "stdafx.h" 
#include <iostream> 

using namespace std; 
class MyClass 
{ 
public: 
MyClass(int x_):m_Index(x_){} 
int m_Index; 
}; 

void myfunction(int *&currentIndex, MyClass obj) 
{ 
currentIndex = &obj.m_Index; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    MyClass obj(5); 

    int *Index = NULL; 
    myfunction(Index, obj); 

    int curr_Index = *Index; 
    cout << "Index = " << curr_Index << std::endl; // This works fine. 
    cout << "Index = " << *Index << std::endl;  // This modifies *Index 
    return 0; 
} 
+0

Was cout Druck ist, und was wollen Sie es drucken zu? – naffarn

+0

"einen Zeiger auf eine Referenz" - "meine Funktion gibt nichts zurück. Es benötigt ein Argument, dessen Typ ** Verweis auf Zeiger auf int ** ist. –

Antwort

7
void myfunction(int *&currentIndex, MyClass obj) 
{ 
currentIndex = &obj.m_Index; 
} 

undefinierten Verhalten Ruft da obj nur gültig für die gesamte Lebensdauer des Funktionsaufrufs ist. Sie behalten einen Zeiger auf ihn (oder eines seiner Mitglieder), den Sie verwenden, nachdem er den Gültigkeitsbereich verlassen hat.

Sie können lösen, indem Sie auf etwas zeigen, das nicht außerhalb des Bereichs liegt (siehe @ songyuanyao's Antwort). In diesem Fall ist nicht klar, warum Sie Zeiger benötigen. myfunction könnte nur den Index zurückgeben.

7

Der Parameter obj wird als Wert übergeben, sodass eine Kopie erstellt wird, die beim Beenden der Funktion zerstört wird. currentIndex wird so eingestellt, dass er auf eine ungültige Adresse verweist, und Dereferenzierung ist undefiniertes Verhalten. Es könnte gut funktionieren, oder es könnte nicht funktionieren, alles ist möglich.

Eine Lösung ist obj zu machen, indem Referenz statt als Wert übergeben werden:

void myfunction(int *&currentIndex, MyClass& obj) 
{ 
    currentIndex = &obj.m_Index; 
}