c – 在重载的operator new中初始化类成员是否未定义?
发布时间:2020-12-16 10:19:33 所属栏目:百科 来源:网络整理
导读:举一个小例子,我试图找出是否在堆上分配变量: 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
举一个小例子,我试图找出是否在堆上分配变量:
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之前对象的存储中的字节值相关. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |