Null终止int数组

时间:2011-08-17 23:05:31

标签: c++ arrays memory

如果我想在C ++中动态创建一个int数组,然后在以后删除它,我是否需要null终止int数组?如果是这样,我该怎么办?如果没有,计算机如何知道要释放多少内存?

int *array = new int[x];
..do some stuff..
delete array;

我知道对于一个char数组,它会删除一个空字符('\ 0'),如果你的字符串中没有终止空字符,你可能会遇到内存冲突错误,但这是如何应用于整数数组(以及其他数组,如结构数组)?

5 个答案:

答案 0 :(得分:6)

你的数组使用的内存块中有一些额外的数据,这些数据对你的程序来说是不可见的,它会告诉delete这个块有多大。

顺便说一句,你对char数组的说法是不正确的 - NUL终结符的存在与delete无关 - 它使用隐藏的块大小,就像任何其他块一样存储器中。

(顺便提一下,当您删除数组时,应该说delete [] array;。)

答案 1 :(得分:3)

如果您使用new[]分配数组,则只需使用delete[]释放它。

如果要分配的类型具有非平凡的析构函数,则需要编译器跟踪分配的大小和计数。

对于字符串,空终止符用于确定字符串的长度,而不是底层内存分配的大小。

答案 2 :(得分:1)

数组的大小始终是已知的。在你的代码中,数组的大小是x的值,因此,程序知道要释放多少内存。

答案 3 :(得分:1)

如果您使用运算符new[]分配任何类型的数组,例如int array[5] = new int[5];,那么您始终可以使用运算符delete[]删除它(注意:不是delete),例如delete[] array;

编译器通过隐藏有关数组长度的一些额外信息来实现这一点,通常就在它开始之前。使用此信息,操作员delete[]可以确切地确定要删除的内存量。

另请注意,NUL终结符与此无关 - 该过程对char数组的工作方式与任何其他类型的数组完全相同。

总之 - 您不需要数组的终结符(任何类型,intchar或其他)。如果您使用new[]进行分配,则可以使用delete[]解除分配。

答案 4 :(得分:0)

  

我知道对于一个char数组,它会删除一个空字符('\ 0'),如果你的字符串中没有终止空字符,你可能会遇到内存冲突错误,但这是如何应用于整数数组(以及其他数组,如结构数组)?

这可能是因为C ++内部结构碰巧在'\0'字符崩溃。

对于数组,请使用:

delete [] array;

C ++处理数组的大小以及要删除的内容。