代码之家  ›  专栏  ›  技术社区  ›  bjskishore123

为什么对大小为零的字节分配成功?

  •  6
  • bjskishore123  · 技术社区  · 14 年前

    这和 What does zero-sized array allocation do/mean?

    我有以下代码

    int *p = new int[0];
    delete []p;
    

    P得到一个地址并被正确删除。

    我的问题是:为什么C++字节首先允许零字节的分配? 为什么不抛出bad-alloc或一些特殊的异常?

    我认为,这只是推迟了灾难性的失败,使程序员的生活变得困难。因为如果要分配的大小是在运行时计算出来的,并且程序员假定它的分配正确,并且试图向内存中写入某些内容,那么最终会损坏内存!!!!在代码中的其他地方也可能发生崩溃。

    编辑:零大小请求时它分配了多少内存?

    5 回复  |  直到 14 年前
        1
  •  4
  •   vitaut    14 年前

    3.7.3.1/2:

    〔32〕。其目的是通过调用malloc()或calloc()实现operator new(),因此规则基本相同。C++与C不同,要求返回一个非空指针的零请求。

    将动态分配的数组与 std::vector 例如。您可以有一个大小为0的向量,那么为什么不允许对数组使用相同的向量呢?无论数组的大小是否为0,访问数组末尾始终是一个错误。

        2
  •  6
  •   Oliver Charlesworth    14 年前

    你为什么要失败?如果程序员试图读/写不存在的元素,那么这是一个错误。初始分配不是(这与例如 int *p = new int[1]; p[1] = 5; )

        3
  •  5
  •   Patrick    14 年前

    很久以前,在使用异常之前,如果分配失败,malloc函数返回一个空指针。

    如果分配零字节也会返回空指针,那么很难区分失败的分配和随后的零字节分配。

    另一方面,如果零字节的分配将返回一个非空指针,则最终会出现两个不同的零字节分配可以具有相同的指针的情况。

    因此,为了简单起见,零字节的malloc函数分配1字节。

        4
  •  3
  •   Abyx    14 年前

    对于int[n]也可以这样说,其中n>0:

    因为如果要分配的大小是在运行时计算的,并且程序员假定它被正确分配并试图写一些东西 超过 那记忆,最终会腐蚀记忆!!!!在代码中的其他地方也可能发生崩溃。

        5
  •  2
  •   lx.    14 年前

    在ISO C++标准下覆盖零大小的数组分配 5.3.4, paragrahp 7

    当直接新声明符中表达式的值为零时,将调用分配函数来分配不带元素的数组。

    这使得执行dnaymic数组分配的代码更加容易。

    一般来说:如果有人调用一个函数并要求它返回一个包含n(在您的例子中是0)个元素的数组,那么代码就不应该试图读取返回的数组中的n-nth元素。

    所以,我并没有真正看到灾难性的失败,因为对于任何n来说,代码都是错误的。

    如你所说:

    因为如果要分配的大小是在运行时计算的,并且程序员假定它的分配是正确的

    计算出的大小将是“0”,如果他试图访问超过他计算出的大小,那么,好吧。我在重复我自己;)