C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 在重载的operator new中初始化类成员是否未定义?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
一个小例子,我试图找出是否在堆上分配变量:

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

它给出了expected result in g++-4.5(带有堆栈对象的警告).这是不明确的定义
做这样的手术?

解决方法

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

您无法保证实现不会在时间操作符新返回和对象构造开始的时间之间擦除内存,也不保证在指定具有标准的不确定值的对象构造成员期间擦除内存(例如,因为它们是POD和没有在像isOnHeap这样的构造函数中显式初始化的内容不会被实现故意设置为某种东西.

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

@H_404_31@

大佬总结

以上是大佬教程为你收集整理的c – 在重载的operator new中初始化类成员是否未定义?全部内容,希望文章能够帮你解决c – 在重载的operator new中初始化类成员是否未定义?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。