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

引用:
作者: bankrock 查看帖子
另外一个存储CBase的容器怎么能存放指向Interface的指针呢?这和C++的强类型机制不符合
我看了下管理器的代码,有个重载的版本,接受void*指针的对象。释放时,仅仅free内存,而不调用dtor。如果希望释放时调用dtor,就需要通过模板把类型信息告诉管理器:
c++ 代码:
  1. class CleanupManager{
  2.   static void add(CBase* p);
  3.   static void add(void* p);
  4.   static void add(CleanupItem& x);
  5. };
  6. ...
  7.  
  8. template <class T>
  9. void addWithDelete(T* p){
  10.   CleanupManager::add(CleanupItem<T>(p));
  11. }
  12.  
  13. template <class T>
  14. void CleanupItem<T>::Delete(void* p){
  15.   delete static_cast<T*>(p);
  16. }

另外,我正在google这些问题:多继承时vtable是什么样子的?为什么对着Base2的指针delete,Base1的dtor也会得到调用?如果所有基类都有virutal dtor,那么就会按照继承树的关系一层一层调用到所有基类,届时各个兄弟基类dtor的调用顺序会是什么样子的?

此帖于 2008-07-28 07:42 PM 被 liuxinyu 编辑.
回复时引用此帖