您的位置:程序门 -> c/c++ -> c++ 语言



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


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


有关虚基类和多继承的地址问题[已结贴,结贴人:turbocamel]
发表于:2007-02-11 10:32:55 楼主
最近又翻了一遍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   返回的地址相同,即使对象在堆中建立。“
发表于:2007-02-11 10:49:351楼 得分:0
和我的想法一样:-).

意思很明显,就是那种情况下,基类地址为必和子类相同.因而,传递基类指针给const   void*就有点问题了.

想不明白为啥要判断.自找麻烦.
发表于:2007-02-11 11:02:242楼 得分:0
为什么基类地址和子类的地址不一定相同呢?
发表于:2007-02-11 12:03:443楼 得分:0
楼主自己搜索一下“非自然多态”的概念,看懂了之后你就理解了。
简单地说,就是:在多重继承/虚拟继承下,多态赋值/初始化时,会发生地址变化。
发表于:2007-02-11 12:46:024楼 得分:20
比如: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;
发表于:2007-02-11 13:31:325楼 得分:0
magicsutra正解。
从p==q并不能推导出(void*)p   ==   (void*)q。
发表于:2007-02-11 13:59:546楼 得分:0
这样的多继承我明白了,我用vc6测试了一下,是有问题,但是虚基类如何解释呢?
发表于:2007-02-12 09:00:487楼 得分:0
虚基类更复杂。原理相似,指针会自动进行调整。


快速检索

最新资讯
热门点击