我遇到了这个:

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);
}

现在如果我们这样做,
Base *p = new Derived;
delete p;

令人惊讶的是,condition inside the Base::delete is not satisfied
我做错什么了吗?还是从void*进行转换会失去Derived*的信息?

最佳答案

函数operator delete是原始内存释放函数。当实际对象(用于驻留在该内存中的对象)已经被销毁时,将调用该方法。 IE。到operator delete时,您的对象已经被清除。指针指向的内存本质上是“原始”,不再包含对象。尝试在此原始内存上使用任何多态功能都是没有用的-它将无法工作。

用更正式的术语来说,根据语言标准,具有非平凡析构函数的对象的生存期将在其析构函数启动后结束。在您的情况下,所有销毁者都已经完成了工作。对象的生命周期已经结束,而dynamic_cast需要一个“事件”对象。

P.S.正式地,只要满足某些条件,就可以在析构函数中使用dynamic_cast(请参见12.7/5),但是当所有析构函数完成时(如您的情况),就不再可以使用dynamic_cast了。

关于c++ - 在重载的运算符delete中,dynamic_cast是否起作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6435521/

10-11 22:37
查看更多