我想知道为什么我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 有 1 个字节用于标识,B 有 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 有 1 个字节用于标识,B 有 4 个字节,因为vptr
它的虚拟析构函数需要它。
但随后在调用 ( )中的调试断言失败delete
_BLOCK_TYPE_IS_VALID
。
环境
我正在使用 Visual Studio 2010 SP1Rel 运行 Windows 7。