考虑
int main()
{
auto a = new int[0];
delete[] a; // So there's no memory leak
}
在复制初始化和删除之间,是否允许您读取
a + 1
上的指针?此外,该语言是否允许编译器将
a
设置为nullptr
?
最佳答案
auto a = new int[0];
根据[basic.compound.3],存储在
a
中的值必须为以下之一:int
)的指针因为没有构造
int
类型的对象,所以我们可以排除第一种可能性。由于C++要求返回非null指针,因此排除了第三种可能性(请参见[basic.stc.dynamic.allocation.2])。因此,我们有两种可能:一个超出对象末尾的指针或无效的指针。我倾向于将
a
视为过去的指针,但是我没有可靠的引用来明确地建立它。 (不过,这在[basic.stc]中有很强的含义,看看如何对这个指针进行delete
。)因此,我将在此答案中考虑这两种可能性。Between the copy initialisation and deletion, are you allowed to read the pointer at
a + 1
?
行为不受[expr.add.4]的限制,无论上面哪种可能性适用。
如果
a
是过去的指针,则认为它指向没有元素的数组的索引0
处的假设元素。仅在j
时定义将整数a
添加到0≤0+j≤n
,其中n
是数组的大小。在我们的情况下,n
为零,因此仅当a+j
为j
时才定义0
的总和。特别是,添加1
是未定义的。如果
a
无效,则我们明确地陷入“否则,行为未定义”。 (毫不奇怪,定义的情况仅覆盖有效的指针值。)Furthermore, does the language permit the compiler to set
a
tonullptr
?
否。根据上述的[basic.stc.dynamic.allocation.2]:“如果请求成功,则可替换分配函数返回的值为非空指针值”。还有a footnote调用C++(但不是C)需要一个非null的指针来响应零请求。
关于c++ - 零长度数组的指针的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442205/