c++ - 零长度数组的指针的属性

标签 c++ language-lawyer

考虑

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+jj时才定义0的总和。特别是,添加1是未定义的。

    如果a无效,则我们明确地陷入“否则,行为未定义”。 (毫不奇怪,定义的情况仅覆盖有效的指针值。)

    Furthermore, does the language permit the compiler to set a to nullptr?



    否。根据上述的[basic.stc.dynamic.allocation.2]:“如果请求成功,则可替换分配函数返回的值为非空指针值”。还有a footnote调用C++(但不是C)需要一个非null的指针来响应零请求。

    关于c++ - 零长度数组的指针的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442205/

    相关文章:

    c++ - c++中堆栈分配数据的生命周期

    c++ - 什么时候使用 boost thread join 函数?

    c++ - 在 C++ 中查找 const vector 中 4 个最大值的迭代器的最有效方法

    c++ - 您可以在Linux终端中编译并运行c++文件吗?

    c++ - vector<Class> 或 vector<unique_ptr<Class>> 在这种情况下?

    c++ - 其他等效的有符号和无符号类型的别名

    c++ - 'auto t = new decltype(nullptr)' 是做什么的?

    c++ - 空结构(或结构填充)可以有任意值吗?

    c++ - std::map 的类型要求

    c++ - C++17 中的新表达式求值顺序