2009-08-22 12 views
12

Ho una classe base A e una classe derivata B:Perché il mio distruttore non ha mai chiamato?

class A 
{ 
public: 
    virtual f(); 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
     p = new char [100]; 
    } 
    ~B() 
    { 
     delete [] p; 
    } 
    f(); 
private: 
    char *p; 
}; 

Per qualsiasi motivo il distruttore non viene mai chiamato - perché? Non lo capisco.

+1

Anche se tutti hanno già capito qual è il problema (dato che è una FAQ in C++), suggerisco comunque di mostrare il codice come si usa la classe B. (Se la usi in questo modo: B * p = new B(); elimina p; e il distruttore non ha mai chiamato, quindi dovrebbe essere un problema completamente diverso.) –

risposta

35

La classe base richiede un distruttore virtuale. Altrimenti il ​​distruttore della classe derivata non verrà chiamato, se viene usato solo un puntatore di tipo A *.

Aggiungere

virtual ~A() {}; 

alla classe A.

+0

c'è qualche ragione per non usare questo distruttore virtuale nella classe principale? – sluki

7

Classe A dovrebbe avere un distruttore virtuale. Senza di ciò, non si chiameranno i distruttori di classe.

+2

Non verrà chiamato se il distruttore viene chiamato tramite un puntatore a A. –

3

provare questo:

class A 
{ 
public: 
    virtual ~A() {} 
    virtual f(); 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
     p = new char [100]; 
    } 
    virtual ~B() // virtual keywork optional but occasionally helpful for self documentation. 
    { 
     delete [] p; 
    } 
    f(); 
private: 
    char *p; 
}; 
3

Se la variabile è di tipo A non ha un distruttore virtuale e così ha vinto' Osservare il tipo di runtime effettivo dell'oggetto per determinare che deve chiamare il Desstructor

A dd un distruttore vuoto alla A

virtual ~ A() {}

e che dovrebbe risolvere il problema.

In generale è necessario eseguire questa operazione su qualsiasi classe che possa essere utilizzata come classe base.

Problemi correlati