2016-04-09 11 views
-1

Angenommen, wir das folgende Stück von C++ Code haben zu befreien:Der richtige Weg Speicher zusammengesetzt Strukturen

struct A 
{ 
    int* a; 
    A() 
    { 
     a = new int(5); 
    } 

    ~A() 
    { 
     delete a; 
    } 
}; 

struct B 
{ 
    A a; 
    int b; 

    B() 
    { 
     a = A(); 
     b = 10; 
    } 
}; 

int main() 
{ 
    B b; 

    return 0; 
} 

Wenn es läuft, wird ein Destruktor zweimal genannt, aber warum? Von was ich verstehe B ruft implizite Destruktor alle Destruktoren von B-Mitgliedern auf, was in Ordnung ist, aber wann kommt der zweite Aufruf von A's Destruktor und warum? Was ist der richtige Weg, um in solchen Fällen mit dem Speicher umzugehen?

+1

Der destructor zum ersten Mal hier genannt werden: 'a = A();' –

Antwort

0

Konstruktoren für Datenelemente werden im Konstruktor Ihrer Klasse aufgerufen. Der Standardkonstruktor für jedes Member wird aufgerufen, bevor die Ausführung die erste Zeile im Konstruktor erreicht, es sei denn, Sie geben explizit einen Konstruktor mit einer Initialisierungsliste an. In diesem Fall wird stattdessen dieser Konstruktor aufgerufen. bitte debuggen diese und Sie werden verstehen mehr, auch von Hand ohne debuger

#include <iostream> 
#include <stdlib.h> 
struct A 
{ 
    int* a; 
    A() 
    { 
     a = new int(5); 
     std::cout<<"A()"<<std::endl; 
    } 

    ~A() 
    { 
     std::cout<<"~A()"<<std::endl; 
     delete a; 
    } 
}; 

struct B 
{ 
    A a; // if you remove this & you remove line 26 there wont be any call to A() 
    int b; 

    B() 
    { 
    // a = A(); // even if this line is removed there still a call to A() constructor 
     b = 10; 
    } 
}; 
void pause() // a simple pause function , that we let the system call before exiting to see the output 
{ 
    system("pause"); 
} 
int main() 
{ 
    atexit(pause); // to pause after calling all destructors 
    B * b = new B(); 
    delete b; 
    B * b1 = new B(); 
    delete b1; 
    return 0; 
} 
Verwandte Themen