如果我想在C ++中动态创建一个int数组,然后在以后删除它,我是否需要null终止int数组?如果是这样,我该怎么办?如果没有,计算机如何知道要释放多少内存?
int *array = new int[x];
..do some stuff..
delete array;
我知道对于一个char数组,它会删除一个空字符('\ 0'),如果你的字符串中没有终止空字符,你可能会遇到内存冲突错误,但这是如何应用于整数数组(以及其他数组,如结构数组)?
答案 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
数组的工作方式与任何其他类型的数组完全相同。
总之 - 您不需要数组的终结符(任何类型,int
,char
或其他)。如果您使用new[]
进行分配,则可以使用delete[]
解除分配。
答案 4 :(得分:0)
我知道对于一个char数组,它会删除一个空字符('\ 0'),如果你的字符串中没有终止空字符,你可能会遇到内存冲突错误,但这是如何应用于整数数组(以及其他数组,如结构数组)?
这可能是因为C ++内部结构碰巧在'\0'
字符崩溃。
对于数组,请使用:
delete [] array;
C ++处理数组的大小以及要删除的内容。