一个简单的测试应用程序:

cout << new int[0] << endl;

输出:

0x876c0b8

看起来是可行的。标准是怎么说的?“分配”空内存块总是合法的吗?


当前回答

是的,像这样分配一个零大小的数组是合法的。但你也必须删除它。

其他回答

是的,用new分配一个0大小的块是完全合法的。你根本不能用它做任何有用的事情,因为没有有效的数据供你访问。Int [0] = 5;是非法的。

然而,我相信标准允许像malloc(0)这样的东西返回NULL。

你仍然需要删除[]你从分配中得到的任何指针。

是的,像这样分配一个零大小的数组是合法的。但你也必须删除它。

奇怪的是,c++要求操作符new返回一个合法的指针 即使请求的字节为零。(这听起来很奇怪 行为简化了语言中其他地方的事情。)

我发现Effective c++第三版在“第51项:写new和delete时坚持约定”中是这样说的。

标准是怎么说的?“分配”空内存块总是合法的吗?

每个对象都有唯一的标识,即唯一的地址,这意味着长度非零(如果您要求零字节,实际的内存量将无声地增加)。

如果你分配了多个这样的对象,你会发现它们有不同的地址。

我向你保证,新的int[0]花费你额外的空间,因为我已经测试过了。

例如, 内存使用情况

int **arr = new int*[1000000000];

明显小于

int **arr = new int*[1000000000];
for(int i =0; i < 1000000000; i++) {
    arr[i]=new int[0];
}

第二个代码段的内存使用量减去第一个代码段的内存使用量就是新整数[0]所使用的内存使用量。