读书人

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

发布时间: 2012-02-12 17:16:34 作者: rapoo

有关虚基类和多继承的地址问题
最近又翻了一遍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;

读书人网 >C++

热点推荐