2013-07-28 13 views
13

との関係は、私は次のコードを持っている:フォワード宣言とデストラクタ

#include <iostream> 
using namespace std; 

class CForward; 

void func(CForward* frw) { delete frw; } 

class CForward 
{ 
public: 
    ~CForward() { cout << "Forward" << endl; } 
}; 

int main() 
{ 
    func(new CForward); 
    cin.get(); 
} 

私はプログラムを実行したが、それは何も印刷されません。

なぜですか?

メインでは、new CFowardを作成し、funcでデストラクタを呼び出しました。

デストラクタが呼び出されていないようです。どうして?それはとにかくフォワード・デクレレーションに関係していますか?

+0

このコードをコンパイルすると、 'g ++'は実際に何が起こっているかを伝えます。 – fuenfundachtzig

+2

少なくともコンパイラの警告レベルを上げます。これは、常に "不完全な型へのポインタの削除"診断を出すべきです。 –

+0

GCCは非常に役に立ちます: '警告:削除オペレータの呼び出しで検出される可能性のある問題:[デフォルトで有効] 'frw'は不完全な型です[デフォルトで有効] 'CForwardクラス'の前方宣言[デフォルトで有効]クラスが定義されたときに宣言されていても、デストラクタやクラス固有の演算子deleteは呼び出されません。 – juanchopanza

答えて

12

確かに、あなたの前方宣言は後に非自明なデストラクタで定義された不完全な型が導入され、それが削除式で使用することはできません。n3337から

、パラグラフ5.3.5/5:

5オブジェクトが削除される場合は、削除の時点で不完全なクラス型を有し、完全なクラスが 非自明なデストラクタまたは解放機能を有し、動作はNEDアンクルFiがあります。

+3

@ user1798362:(単にコンパイラが生成したものを使うのではなく)クラスデストラクタを定義した場合、それは自明ではありません。再帰的に、あなたのクラスに非自明のデストラクタを持つメンバがあれば、あなたのクラスは非自明のデストラクタを持ちます。他のすべてのデストラクタは簡単です(実際には何もしません)。 –

1

はい。実際に関数funcでは、コンパイラはcForwardの完全な型を知らない。だから、デクストラクタは呼ばれていません。

クラスの後に関数を置くと正常に動作します。

関連する問題