delete[]字符数组

delete[] Array of characters

本文关键字:数组 字符 delete      更新时间:2023-10-16

可能重复:
delete[]提供了一个修改后的新ed指针。未定义的行为?

假设我已经使用new char[number]分配了一些字符。

是否可以只删除几个结束字符(类似于delete[] (charArray + 4);,它将取消分配除前四个字符之外的所有字符(?

我读到一些实现的new[]存储在对象数组之前分配的对象数,这样delete[]就知道要取消分配多少对象,所以按照我的要求执行可能不安全。。。

谢谢。

编辑:

使用单独的delete语句手动删除不需要的结束字节是一种安全的方式吗?

不,您必须使用与new[]返回的指针完全相同的delete[]

不能删除数组的特定段。

如果您只是对C字符串进行操作,您可以将一个字符设置为,并且任何对该字符串进行操作的函数都将停止,因为C字符串以null结尾。

如果你真的需要释放内存,那么最接近的方法就是制作一个新的、更小的数组,复制元素,并将delete[]作为旧数组。

char* TenCharactersLong = new char[10];
// ...
char* FirstFiveCharacters = new char[5];
for (std::size_t Index = 0; Index < 5; Index++)
{
    FirstFiveCharacters[Index] = TenCharactersLong[Index];
}
delete[] TenCharactersLong;

唯一"安全"的方法是分配一个新数组,复制数据,然后删除旧数组。或者,您可以按照std::vector的方式,区分"容量"(数组的大小(和"大小"(数组中元素的数量(。

没有,对不起。内存分配非常复杂,包括碎片、对齐、填充、开销等等。这样的功能只会进一步加剧这些问题。

使用单独的delete语句手动删除不需要的结束字节是一种安全的方式吗?

甚至不要尝试。这可能很危险。总是使用delete[]解除分配数组。

我强烈建议阅读关于这个主题的C++FAQ Lite:16.13,16.14

否,您只能删除整个数组。

不,你不能那样做。我建议使用std::向量。通过这种方式,您可以精确定位要删除的索引,并让库为您处理它。