2012-03-27 3 views
0

Headerdatei Drücken der Taste:Vector Größenänderungen nach in QT

private: 
vector<int*>* nums; 

public slots: 
void buttonClicked(); 

CPP-Datei: als

NewWindow(){ 
    int one = 1; 
    int* pone = &one; 
    int two = 2; 
    int* ptwo = &two; 

    vector<int*> numbers; 
    numbers.push_back(pone); 
    numbers.push_back(ptwo); 
    nums = &numbers; 

    test(); 
} 

//Prints size of nums vector 
void NewWindow::test(){ 
    stringstream woo; 
    woo << nums->size()<<endl; 
    cout << woo.str(); 
} 

//I just had one button on my gui 
void NewWindow::buttonClicked(){ 
    test(); 
} 

Als ich dies ausführen, wird die erste Testmethode führt in den contructor und Ausgängen 2, erwartet . Nach dem Anklicken der Schaltfläche (d. H. Der Ausführung der Methode buttonClicked()) gibt die Testmethode jedoch eine scheinbar willkürliche Zahl aus (z. B. 4292719658). Nachdem ich ein wenig herumgespielt habe, habe ich entdeckt, dass die Methode test() jedes Mal 2 ausgibt, wenn ich den Zahlenvektor als Attribut verwende. Warum bekam ich eine seltsame Ausgabe mit Zahlen als Nichtattribut?

Antwort

2

Wenn numbers ist eine lokale Variable, wie hier:

NewWindow(){ 
    vector<int*> numbers; 
    nums = &numbers; 
} 

dann wird es zerstört, und hört auf, zu existieren, wenn es den Bereich verlässt. In diesem Fall, wenn die Funktion NewWindow zurückgibt. Wenn Sie auf ein nicht vorhandenes Objekt verweisen (wie Sie es über den Zeiger nums tun), führt dies zu einem nicht definierten Verhalten.

Wenn numbers eine Membervariable ist, wird sie dagegen zerstört, wenn das Objekt, dessen Mitglied sie ist, zerstört wird.