operator new的任何实现都会返回指向零大小数组的保护页面的指针吗?

Ale*_*cio 8 c++ new-operator

相关:C++ new int [0] - 它会分配内存吗?

该标准在5.3.4/7中说:

当direct-new-declarator中的表达式的值为零时,将调用分配函数以分配不带元素的数组.

......并且,在3.7.3.1/2中:

取消引用作为零大小请求返回的指针的效果是未定义的.

...但是,指针不能是空指针.

由于实际解除引用指针是未定义的行为,是否有任何实现返回指向保护页面的指针?我想这很容易,并且有助于检测错误/提高安全性.

Aar*_*onI 4

我查看了(草案)标准,但找不到任何明确禁止这样做的内容。不过,我猜答案是“不”。这就是为什么:

  • 正如你所说,new 需要返回一个非空指针。
  • 此外,无论它返回什么,都必须安全地传递到删除。
  • 因此“随机值”不起作用,因为它会破坏删除。
  • 还需要为每次调用返回不同的值(至少在它们被删除之前) - 请参阅 C++ 标准部分 basic.stc.dynamic.allocation。
  • 此时只剩下一个选择:返回“假指针”,这些指针可以通过delete以某种方式识别为“假指针”。

一种可能的实现可以通过保留一系列未分页内存来完成,每次有人调用 new int[0] 时,它都可以返回该范围内的不同地址(如果分配器保留全局计数器或类似的东西,则很容易做到)。

从好的方面来说,您将能够立即检测此类指针的取消引用。另一方面,您将失去检测双重释放的能力,因为指针上的删除实际上变成了无操作,并且在所有正常情况下,您将使新的和删除变得更加复杂和缓慢。

因此,因为这很难做到,而且弊大于利,所以我非常有信心没有人这样做。

Linux 上的 gcc 只是分配少量内存并返回它。我相信这几乎是执行此操作的标准方法。