我的问题在代码注释中:
int* a = new int[0];// I've expected the nullptr according to my logic...
bool is_nullptr = !a; // I got 'false'
delete[] a; // Will I get the memory leaks, if I comment this row?
谢谢。
我的问题在代码注释中:
int* a = new int[0];// I've expected the nullptr according to my logic...
bool is_nullptr = !a; // I got 'false'
delete[] a; // Will I get the memory leaks, if I comment this row?
谢谢。
对于C++11,鉴于您的代码:
int* a = new int[0];
根据5.3.4/7规定,零是一种合法的尺寸:
当noptr-new-declarator表达式的值为零时,调用分配函数来分配一个没有元素的数组。
按照18.6.1.2所述,调用的运算符如下(强调为本人添加):
void* operator new[](std::size_t size);
...
3 必要行为:与operator new(std::size_t)的要求相同。此要求对该函数的替代版本具有约束力。
4 默认行为:返回operator new(size)。
...参考18.6.1.1...
void* operator new(std::size_t size);
3 要求行为:返回一个适当对齐的存储器的非空指针(请参见 3.7.4),否则抛出 bad_alloc 异常。此要求对此函数的替代版本具有约束力。
因此,返回的指针必须是非空的。
您需要在使用完后delete[]
它。
new int[0]
会导致未定义的行为,因为[]
之间的值必须是严格正值 - 零是不好的(5.3.4/6 "New")。因此,在这之后询问是否存在内存泄漏在某种意义上是无意义的。new int[0]
会调用分配器来分配零长度数组(5.3.4/7 "New")。如果分配请求成功,则会返回一个指针 - 标准没有说明该指针所指向的块包含多少内存,除了它必须至少是请求的大小。然而,它至少具有分配至少一个字符的效果,因为该地址不能再次由分配器返回,直到它被释放。在实践中,簿记开销将超过一个字符。new float [n] [5]
,其中5
(常量表达式)应该是正数(并在编译时评估),而n
(表达式)应该是非负数(并在运行时评估)。 - anatolyg是的,有一个泄漏问题,并且它不依赖于实现。
这个新表达式无法产生空指针。它通过调用operator new[]
来分配内存,该函数必须“返回适当对齐的存储器的非空指针,否则抛出bad_alloc
异常”(参见C++11 §18.6.1.1/3和§18.6.1.2/3)。
此外,分配函数的要求(§3.7.4.1)要求每次调用分配函数返回一个指针,该指针与已分配但尚未释放的所有其他指针都不同。因此,实现不能简单地具有单个“空分配”指针,它总是返回该指针。
因此,每个数组形式的new表达式都会分配某些东西,即使大小为零。如果您不通过delete[]
释放该对象,则会导致泄漏。
是的,如果没有delete
,就会出现内存泄漏。
每个new
都必须与delete
配对使用。即使程序员分配的大小为0,分配器也可能分配比请求更多的内存,因为需要对齐、管理开销或其他原因。
new int[0]
请求返回一个新指针,并且这些指针在所有分配中必须是唯一的。很明显,在一些未跟随 delete
的 new
操作之后,将会用尽指针。 - user4815162342nullptr
还是不返回由实现定义,但你需要小心,不要对指针进行解引用,同时不调用delete
会导致内存泄漏。delete
的规则很简单:如果你调用了new
,就必须调用delete
。nullptr
。delete
,会发生什么?会泄漏多少内存? - Kolyunyadelete
,则分配的任何内存(取决于实现)都将泄漏。唯一确定的是它将是非零的。 - Alok Save0
字节就没有什么需要删除的...谢谢你提供的信息。 - Kolyunyanew T[0]
不能产生 nullptr
。 - James McNellis
malloc(0)
可能会返回一个可以传递给free
的有效指针,也可能返回NULL
。这是实现定义的。 - Some programmer dude