gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:46:51 25 4
gpt4 key购买 nike

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

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 中初始化类成员,因为对象的生命周期尚未开始。您只能在对象构造期间初始化成员。

您不能保证实现不会删除 operator new 返回时间和对象构造开始之间的内存,或者在对象构造期间指定具有不确定值的成员按照标准(例如,因为它们是 POD,并且没有像 isOnHeap 那样在构造函数中显式初始化)不会被实现故意设置为某些东西。

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

关于c++ - 在重载的 operator new 中初始化类成员是否未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6530689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com