前戏
先抛出两个问题
- 如果
delete
一个指针,但是它真实的类型和指针类型不一样会发生什么? - 是谁调用了析构函数?
下面这段代码会发生什么有趣的事情?
// delete_diff_type.cpp #include <iostream> using namespace std; class Foo { public: Foo() { cout << "Foo()" << endl; } ~Foo() { cout << "~Foo()" << endl; } }; class FakeFoo { public: FakeFoo() { cout << "FakeFoo()" << endl; } ~FakeFoo() { cout << "~FakeFoo()" << endl; } }; int main(int argc, const char * argv[]) { void* vptr = new Foo(); delete vptr; // warning // FakeFoo* ffptr = static_cast<FakeFoo*>(new Foo()); // error FakeFoo* ffptr = reinterpret_cast<FakeFoo*>(new Foo()); delete ffptr; Foo* fptr = new Foo(); delete fptr; return 0