dynamic_cast是否在重载运算符内部工作?

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不再可用.


Jam*_*lis 9

一旦你的operator delete重载获得指针,指向的对象就被破坏了(~Derived()析构函数已被调用).

在它被销毁之后你不能再将它当作一个Base或一个Derived对象来对待,因为它不再是一个Base或一个Derived对象.