6

このコードはWeb サイトで見つけました

#include <iostream>

using namespace std;

struct Base
{
    Base() { cout << "Base" << " "; }
    virtual ~Base() { cout << "~Base" << endl; }

    int i;
};
struct Der : public Base
{
    Der() { cout << "Der" << endl; }
    virtual ~Der() { cout << "~Der" << " "; }

    int it[10]; // sizeof(Base) != sizeof(Der)
};

int main()
{
    Base *bp = new Der;
    Base *bq = new Der[5];

    delete    bp;
    delete [] bq;   // this causes runtime error
}

なぜクラッシュするのですか?

4

1 に答える 1

11
Base *bq = new Der[5];
delete [] bq;   // this causes runtime error

その理由は、配列がポリモーフィックに扱われないためです。したがって、上記のコードでは、deleteステートメントは未定義の動作を呼び出します。

§5.3.5/3 C++03 は言う

最初の選択肢 (オブジェクトの削除) では、オペランドの静的型がその動的型と異なる場合、静的型はオペランドの動的型の基本クラスであり、静的型は仮想デストラクタを持つか、動作が未定義です。 . 2 番目の選択肢 ( delete array ) では、削除するオブジェクトの動的な型がその静的な型と異なる場合、動作は未定義です。

実行時エラーが発生することは幸運であり、コードの重大なバグをできるだけ早く知る機会がありました。

于 2011-10-13T13:12:46.263 に答える