可能重复:
delete[] supplied a modified new-ed pointer. Undefined Behaviour?
假设我使用new char[number]
分配了一些字符。
是否可以只删除一些结束字符(类似于delete[] (charArray + 4);
,这可能会取消分配除前四个字符之外的所有字符)?
我读到一些实现'new[]
存储在对象数组之前分配的对象数,以便delete[]
知道要解除分配的对象数量,所以做我所做的事情可能不安全我问......
感谢。
修改
使用单独的delete
语句手动删除不需要的结束字节是一种安全的方式来做我要问的事吗?
答案 0 :(得分:6)
不,你必须delete[]
使用new[]
获得完全相同的指针。
答案 1 :(得分:2)
您无法删除数组的特定段。
如果您只是对C字符串进行操作,则可以将字符设置为\0
,并且对字符串进行操作的任何函数都将停止,因为C字符串以空值终止。
如果你真的需要释放那个内存,你可以得到的最接近的是创建一个新的,更小的数组,复制元素,并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;
答案 2 :(得分:1)
唯一“安全”的方法是分配一个新数组,复制数据并删除旧数组。或者您可以按照std::vector
方式区分“容量”(数组的大小)和“大小”(其中的元素数量)。
答案 3 :(得分:1)
不,抱歉。内存分配足够复杂,包括碎片,对齐,填充,开销等等。像这样的功能只会进一步扩大这些问题。
使用单独的删除语句手动删除不需要的结束字节是一种安全的方式来做我要求的吗?
甚至不要尝试。这可能很危险。始终使用delete []解除分配数组。
答案 4 :(得分:0)
不,您只能删除整个数组。
答案 5 :(得分:0)
不,你不能这样做。我建议使用std :: vector。这样,您就可以精确定位要删除的索引,并让库为您处理它。