在运算符new的重载中调用新表达式

问题描述 投票:2回答:1

根据C ++标准,以下代码是否为未定义行为?请共享C ++标准参考。

void* operator new(std::size_t sz)
{
    return ::new int(5);
}
c++ new-operator
1个回答
2
投票
6.7.5.4.1

1特别讨论分配功能的要求。它列出了此类函数必须满足的所有要求,并且没有明确禁止调用全局分配函数。

它确实这样说:

如果成功,它将返回一个存储块开始的地址,该存储块的字节长度至少等于请求的大小。

您的函数总是返回一个等于sizeof(int)的块。

6.7.5.4

也这样说

如果分配或释放功能的行为不满足[basic.stc.dynamic.allocation]和[basic.stc.dynamic.deallocation]中指定的语义约束,则该行为未定义。

此答案的先前版本忽略了这一点。您的函数不会返回与请求的大小相等(被忽略)的内存块,因此行为未定义。
© www.soinside.com 2019 - 2024. All rights reserved.