iam*_*ind 5 c++ dynamic-cast operator-overloading
我遇到了这个:
struct Base {
void* operator new (size_t);
void operator delete (void*);
virtual ~Base () {} // <--- polymorphic
};
struct Derived : Base {};
void Base::operator delete (void *p)
{
Base *pB = static_cast<Base*>(p);
if(dynamic_cast<Derived*>(pB) != 0)
{ /* ... NOT reaching here ? ... */ }
free(p);
}
Run Code Online (Sandbox Code Playgroud)
如果我们这样做,
Base *p = new Derived;
delete p;
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,Base :: delete中的条件不满意
我做错了什么?或者从void*丢失信息中获取信息Derived*?
AnT*_*AnT 15
函数operator delete是原始内存释放函数.当实际对象(以前驻留在该内存中)已经被破坏时调用它.就在你进入operator delete你的时候,物体已经被消灭了.指针指向的内存基本上是"原始",它不再包含一个对象.试图在这个原始内存上使用任何多态功能是没用的 - 它不起作用.
在更正式的术语中,根据语言标准,具有非平凡析构函数的对象的生命周期一旦其析构函数启动就结束.在你的情况下,所有析构函数已经完成了他们的工作.对象的生命周期已经结束,同时dynamic_cast需要一个"实时"对象.
PS形式上,dynamic_cast只要满足某些条件(见12.7/5),允许在析构函数中使用,但是当所有析构函数完成时(如在您的情况下),dynamic_cast不再可用.
一旦你的operator delete重载获得指针,指向的对象就被破坏了(~Derived()析构函数已被调用).
在它被销毁之后你不能再将它当作一个Base或一个Derived对象来对待,因为它不再是一个Base或一个Derived对象.
| 归档时间: |
|
| 查看次数: |
852 次 |
| 最近记录: |