是否未定义在重载的operator new中初始化类成员?

iam*_*ind 3 c++ initialization new-operator undefined-behavior

举一个小例子,我试图找出是否在堆上分配变量:

struct A
{
  bool isOnHeap;
  A () {}  // not touching isOnHeap
 ~A () {}

  void* operator new (size_t size)
  {
    A* p = (A*) malloc(size);
    p->isOnHeap = true;  // setting it to true
    return p;
  }
  void operator delete (void *p) { free(p); }
};
Run Code Online (Sandbox Code Playgroud)

它给出了g ++ - 4.5的预期结果(带有堆栈对象的警告).做这样的手术是不是很明确?

CB *_*ley 6

您无法在重载中初始化类成员,operator new因为该对象的生命周期尚未开始.您只能在构造对象期间初始化成员.

您无法保证实现不会在时间operator new返回和对象构造开始的时间之间擦除内存,也不保证在指定具有标准的不确定值的对象构造成员期间擦除内存(例如,因为它们是POD而不是明确的在构造函数中初始化的isOnHeap)不是故意通过实现设置的东西.

请注意,它A有一个非平凡的构造函数(它是用户声明的),因此当分配对象的存储(ISO/IEC 14882:2003,3.8 [basic.life]/1)时,它的生命周期不会启动如果程序使用指向存储的指针来访问非静态数据成员(3.8/5),则程序具有未定义的行为.即使A是POD类型,在new-expression完成之后它的值仍然是不确定的,而不一定与在评估new-expression之前对象的存储中的字节值相关.