首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

有关虚基类和多继承的地址有关问题

2012-02-12 
有关虚基类和多继承的地址问题最近又翻了一遍MoreEffectieveC++,碰见不少新问题,其中有一个判断对象是否在

有关虚基类和多继承的地址问题
最近又翻了一遍More   Effectieve   C++,碰见不少新问题,其中有一个判断对象是否在堆中的代码如下:
1.重载Operator   new
  void   *operator   new(size_t   size)
{
    void   *p   =   getMemory(size);                   //调用一些函数来分配内存,
                                                                          //处理内存不够的情况
    把   p加入到一个被分配地址的集合;
    return   p;
}
2.重载operator   delete
void   operator   delete(void   *ptr)
{
    releaseMemory(ptr);                                 //   return   memory   to
                                                                          //   free   store
    从被分配地址的集合中移去ptr;
}
3.判断地址是否由new产生。
bool   isSafeToDelete(const   void   *address)
{
    返回address是否在被分配地址的集合中;
}
在每次调用delete之前先要调用isSafeToDelete,来决定是否需要调用delete.

这就是基本的流程,这段代码肯定有问题,但是下面这段话有一点不太明白,请指教

“实现isSafeToDelete让它总能够正常工作是不可能的。难点是多继承下来的类或继承自虚基类的类有多个地址,所以无法保证传给isSafeToDelete的地址与operator   new   返回的地址相同,即使对象在堆中建立。“


[解决办法]
比如:class A{int a; virtual ~A(){}}; class B{int b; virtual ~B(){}}; class C:public A, public B{int c; virtual ~C(){}}.则C的对象地址是A对象的地址,但不是B对象的地址。B对象的地址是C对象的地址加上A对象的偏移(即A对象的大小)。所以对以下语句上述不成立:B *pB = new C;此时pB与new C得到的地址不相等,经过编译器的调整:pB = (Byte*)(new C) + sizeof(B);考虑delete pB;

热点排行