delete
ここでは、あるケースでは例外が発生するのに、他のケースでは例外が発生しないのはなぜだろうか。
特例なし
#include <iostream>
using namespace std;
class A
{
public:
~A() { cout << "A dtor" << endl; }
};
class B : public A
{
public:
int x;
~B() { cout << "B dtor" << endl; }
};
A* f() { return new B; }
int _tmain(int argc, _TCHAR* argv[])
{
cout << sizeof(B) << " " << sizeof(A) << endl;
A* bptr= f();
delete bptr;
}
ここでの出力は です。これは4 1 .. A dtor
、A の ID が 1 バイトであり、B の ID が 4 であるためですint x
。
例外ケース
#include <iostream>
using namespace std;
class A
{
public:
~A() { cout << "A dtor" << endl; }
};
class B : public A
{
public:
virtual ~B() { cout << "B dtor" << endl; }
};
A* f() { return new B; }
int _tmain(int argc, _TCHAR* argv[])
{
cout << sizeof(B) << " " << sizeof(A) << endl;
A* bptr= f();
delete bptr;
}
ここで、出力は です。これは4 1 .. A dtor
、A の ID が 1 バイトであり、B がvptr
仮想デストラクタに必要なため 4 バイトであるためです。
しかし、デバッグ アサーションはdelete
call( _BLOCK_TYPE_IS_VALID
)内で失敗します。
環境
Visual Studio 2010 SP1Rel で Windows 7 を実行しています。