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();
}

プログラムを実行しましたが、何も出力されませんでした。

なんで?

main では を作成しnew CFoward、 ではfuncそれを削除してデストラクタと呼びました。

デストラクタが呼び出されていないようです。なんで?それはとにかく前方宣言に関連していますか?

4

2 に答える 2

12

実際、前方宣言は、後で重要なデストラクタで定義される不完全な型を導入し、削除式では使用できません。

n3337、パラグラフ 5.3.5/5 から:

5 削除されるオブジェクトが削除の時点で不完全なクラス型を持ち、完全なクラスに重要なデストラクタまたは解放関数がある場合、動作は未定義です。

于 2013-07-28T18:43:51.767 に答える
1

はい。実際、関数 func では、コンパイラは cForward の完全な型を知りません。したがって、デストラクタを呼び出す必要はありません。

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

于 2013-07-28T18:46:36.180 に答える