2016-12-13 1 views
0

Class.h:Zuweisen Artikel des Zeigers in Konstruktor Klasse atribute erstellt

class Main_manager 
{ 
    public: 
     Main_manager(); 
     ~Main_manager(); 
     Field_manager* field_manag; 
    } 
} 

Klasse contructor:

Main_manager::Main_manager() { 
    Field_manager* field_manager = new Field_manager; 
    this->field_manager = field_manager; 
} 

Ich dachte, dass this-> field_manager = field_manager den Zeiger auf das halten würde just-created field_manager-Objekt als ein Attribut der Main_manager-Klasse, und so wäre ich in der Lage, seine Methoden zu verwenden.

, wenn ich versuche zu nennen

Main_manager::function() { 
    this->field.manager->function_call(); 
    //trying to call field.manager's method as i should have its pointer 
} 

Es funktioniert nicht. Die Anwendung bricht aufgrund der Unfähigkeit, den Speicher zu lesen.

this>field.manager = field_manager funktioniert wahrscheinlich nicht. Nachdem der Konstruktor beendet ist, kann Main_manager den Speicher für field_manager nicht lesen. Ich dachte, wenn ich den field_manager Zeiger als Klassenattribut behalten würde, wäre alles in Ordnung.

+0

Ist 'Field_manager * field_manager = neuer Field_manager;' Ergebnis in eine Ausnahme oder ergibt ein 'nullptr'? –

Antwort

1

Ich dachte, dass this-> field_manager = field_manager den Zeiger halten würde

Sie müssen dies nicht tun:

Field_manager* field_manager = new Field_manager; 
this->field_manager = field_manager; 

Statt im Konstruktor zuweisen einfach Ihre Zeiger Mitglied direkt:

+1

Warum nicht einfach 'Field_manager field_manager?' Was ist der Vorteil von 'new' für diesen Fall? –

+0

vielen Dank. Also in diesem Problem habe ich drüben abgebildet, alle diese Gegenstände wurden zerstört, nachdem der Konstrukteur vorbei war, nicht wahr? – sadboy

+0

Nein, nur der Zeiger im Konstruktor, der zufällig denselben Namen wie das Klassenmitglied hat, wurde zerstört. Der Speicher, den Sie zugewiesen haben, bleibt reserviert und das Field_manager-Objekt ist noch aktiv, obwohl nicht erreichbar. Sie haben ein Speicherleck. Der Zeiger des Klassenmembers wird nie initialisiert (nicht einmal zu nullptr) und enthält den Datenmüll. Die Dereferenzierung führt zu undefiniertem Verhalten. Bitte schauen Sie sich die Begriffe RAII, Member Initialization List, Smart Pointer und Rule of Three/Rule of Five an, um eine bessere Vorstellung davon zu bekommen, wie Sie diese Probleme vermeiden können. – mars

Verwandte Themen