2009-08-22 14 views
12
私はベースクラスAと派生クラスBを持っています:

なぜ私のデストラクタは呼び出されませんでしたか?

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

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

何らかの理由でデストラクターは呼び出されません - なぜですか?私はこれを理解していない。

+1

誰もがすでに問題を理解していましたが(C++のよくある質問です)、クラスBの使い方を示すコードを提示することをお勧めします(このように使用すると、B * p = new –

答えて

35

基本クラスには仮想デストラクタが必要です。それ以外の場合は、型A *のポインタのみが使用されている場合、派生クラスのデストラクタは呼び出されません。

この試みるクラスAに

+0

へのポインタを介して呼び出された場合、この仮想デストラクタを使用しない理由は何もありませんメインクラスで? – sluki

7

クラスAには仮想デストラクタが必要です。これがなければ、クラスのデストラクタを呼び出すことはできません。

+2

デストラクタがA. –

3

virtual ~A() {}; 

を追加:あなたの変数の型がAである場合、それは仮想デストラクタを持っていないので、それは勝った

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

を実際の実行時の型を調べて、デストラクタを呼び出す必要があることを確認する

A

仮想〜A(){}

に空のデストラクタをDDと、それはそれを修正しなければなりません。

一般に、基本クラスとして使用できるクラスであれば、これを行う必要があります。

関連する問題