2017-05-08 4 views
-1

Warum kann ich im folgenden Code printAlternativ, aber nicht print anrufen? Zu meinem Verständnis sollte das Objekt entfernt werden und keines sollte funktionieren.Rufen Sie die Elementfunktion auf, obwohl das Objekt nicht existiert.

using namespace std; 

class MemTest 
{ 
public: 
    MemTest(string); 
    ~MemTest(); 
    void print(); 
    void printAlternative(); 
    string name; 
}; 

void MemTest::print() { 
    cout << "Print: " << name << "\n"; 
} 

void MemTest::printAlternative() { 
    cout << "Print Alternative\n"; 
} 

MemTest::MemTest(string n) { 
    cout << "Constructor\n"; 
    name = n; 
} 

MemTest::~MemTest() { 
    cout << "Destructor\n"; 
} 

void call(MemTest *b) { 
    MemTest a("TestName"); 
    a.print(); 
    b = &a; 
} 

int main() 
{ 
    MemTest *b = NULL; 
    call(b); 
    b->print(); // This crashes 
    // b->printAlternative(); This works 

    return 0; 
} 
+9

Willkommen bei Land nicht definiertes Verhalten Objekt und Compiler deklarieren. Die einzige Regel ist, dass es keine Regeln gibt. – NathanOliver

+0

Schon mal von 'neuem' Operator gehört – Sniper

+5

Kurze Antwort - weil' printAlternativ' auf keine Member der Klasse zugreift, also eine Instanz nicht _technisch_ benötigt wird. Aber das funktioniert nicht garantiert. – icabod

Antwort

1

Nach call() Objekt zerstört erhalten, so dass nun b Objekt hat keine Referenz eines Objekts und Sie versuchen, „name“ Datenmitglied Objekt zuzugreifen, weil dass es abgestürzt bekommen. Sie können es überprüfen, indem Sie einen Cout < < "Testlinie" hinzufügen; nach Anruf (b); Linie in main()

Und warum andere arbeitet, weil Mitgliederfunktionen mit Klasse zugeordnet sind und zugewiesen werden, wenn erste Mal, dass wir nur Swipe Daten Mitglied in destructor()

+0

Kann ich mich auf dieses Verhalten verlassen, weil es so aussieht, als würden Sie vorschlagen, dass dieses Verhalten von Entwurf ist. Hast du irgendwelche Beweise dafür, weil ich keine gefunden habe? – Gasare

+0

Wie wir wissen, wird die Funktion nur einmal im Speicher initialisiert und funktioniert für jedes Objekt nur stapelweise bei jedem Datenaufruf. Aus diesem Grund wischt der Destruktor nicht. –

Verwandte Themen