查看单个帖子
  #6 (permalink)  
旧 2008-07-28
liuxinyu 的头像
liuxinyu liuxinyu 当前离线
高级会员
 
注册日期: 2006-02-09
帖子: 311
文章: 49
liuxinyu 正向着好的方向发展
默认 回复: 为什么会crash?

我刚才在每个类里加了两个输出用于查看指针位置:
c++ 代码:
  1. static void* operator new(size_t size){
  2.     void* p=::operator new(size);
  3.     std::cout<<"Base2 new: "<<std::hex<<p<<"\n";
  4.     return p;
  5.   }
  6.  
  7.   static void operator delete(void* p){
  8.     std::cout<<"Base2 del: "<<std::hex<<p<<"\n";
  9.     ::operator delete(p);
  10.   }
程序输出:
Derived new: 0x6a02a8
f
Base2 del: 0x6a02ac
11946 [sig] a 3356 _cygtls::handle_exceptions: ...

所以pb1, pb2和p实际指向的位置是不同的。

而如果,调用delete pb1,就会显示:
Derived new: 0x6a02a8
f
Derive dtor
Derived del: 0x6a02a8

程序正确的进入了子类的operator delete,而不是进入了pb1的operator delete

有趣的是,这是个多重继承,如果把Base2的virtual dtor打开,并且delete pb2,则程序输出:
Derived new: 0x6a02a8
f
Derive dtor
Base2 dtor
Base1 dtor
Derived del: 0x6a02a8

注意到:第一父类Base1的dtor也被调用了。这里面vtable是什么样子呢?
回复时引用此帖