以空值作为结尾的整型数组

3
如果我想在C++中动态创建一个整数数组,然后稍后将其删除,我需要在整数数组中添加空终止符吗?如果是这样,我该怎么做?如果不是,计算机如何知道要释放多少内存?
int *array = new int[x];
..do some stuff..
delete array;

对于字符数组,删除的范围是到空字符('\0')为止。如果字符串中没有终止的空字符,可能会导致内存违规错误。但是这个规则适用于整型数组(以及其他类型的数组,如结构体数组)吗?


2
我知道对于一个 char 数组,它删除直到空字符('\0')为止。但这完全不正确;你为什么会这样认为? - James McNellis
嗯,我认为说你永远不应该想做这件事有点过了。我总体上同意你的观点,但有时候你想要使用低级别的C语言——例如为了速度或与使用数组作为函数参数的库进行交互。是的,在大多数情况下,方便和安全比过度优化速度更重要,但并非所有情况都是如此,请尽可能使用类库。 - iandotkelly
1
@iandotkelly:C 数组并不比向量更快。而使用 &v[0],您可以直接访问包含在指针中的数组,以便用于接受指针的函数。 - Benjamin Lindley
@Benjamin Lindley - 只是出于好奇(来自一位C、C#和Objective-C程序员的真诚问题),您能否通过引用将底层数组传递给一个函数,以更改其内容?如果可以,并且仍然安全,我会印象深刻。即使在今天,我仍然认为了解C数组的工作原理也很重要;-) - iandotkelly
@iandotkelly:您可以访问和修改元素,但不能更改数组的结构,即添加或删除元素。 - Benjamin Lindley
显示剩余3条评论
5个回答

6
您的数组使用的内存块中有一些额外的数据,这些数据对您的程序不直接可见,但告诉delete内存块的大小。
顺便说一句,您关于char数组的说法是不正确的——NUL终止符的存在与否与delete无关——它像处理其他任何内存块一样使用隐藏的块大小。
(顺便说一句,当您删除一个数组时,应该使用delete [] array;。)

谢谢!delete array 和 delete [] array 有什么区别? - JimR
@Sam:delete [] 知道如何调用数组中每个成员的析构函数,而普通的 delete 不知道。 - RichieHindle
Delete[]也会清除元素计数。普通的delete是错误的。 - MSalters

3
如果你用new[]分配一个数组,你只需要用delete[]释放它。
如果你所分配的类型有一个非平凡的析构函数,那么编译器必须跟踪分配的大小和计数。
至于字符串,空终止符是用来确定字符串长度的,而不是底层内存分配的大小。

编译器不会跟踪数组的大小。请参见我的答案下 Keith 的评论。 - Nick Rolando
@Shredder,编译器生成的代码会添加跟踪信息,以便在调用delete[]删除由new[]返回的指针时,生成调用正确数量析构函数的代码。我不想那么详细地解释,所以我把它缩短为“编译器需要跟踪大小和计数”。如果您查看operator new[]的返回值和new type[...]的指针,您会发现它们并不总是相同的值。区别在于编译器放置数组计数的位置。 - MSN

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

这个答案有几个错误。编译器将C++代码转换为机器码,然后就完成了。它不会释放内存,因为程序运行时它并没有在运行。此外,除非x是一个常量,否则编译器不知道x是什么,因为x直到程序运行时才会被赋值。 - Keith Irwin
我不是指编译器,而是指程序。我在谈论运行时。抱歉,我进行了编辑。 - Nick Rolando

1
如果你使用操作符new[]来分配一个任何类型的数组,例如int array[5] = new int[5];,那么你总是能够使用操作符delete[](注意:不是delete)来销毁它,例如delete[] array;
编译器通过隐藏一些额外的关于数组长度的信息实现了这一点,通常就在数组开始之前。使用这些信息,操作符delete[]可以精确地知道要删除多少内存。
同时请注意,NUL终止符与此无关——对于char数组与其他类型的数组,该过程的工作方式完全相同。
总之,你不需要为数组(任何类型的数组,如intchar等)添加终止符。如果你使用new[]来分配它,你可以使用delete[]来释放它。

0
我知道对于char数组,它会删除到空字符('\0'),如果你的字符串中没有终止空字符,你可能会遇到内存违规错误,但这对int数组(以及其他数组,比如结构体数组)如何应用呢?
这可能是因为C++的内部恰好在'\0'字符处崩溃。
对于数组,请使用:
delete [] array;

C++ 处理数组的大小和删除量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接