请考虑以下事项:
char* msg = new char[20];
msg[4] = '\0';
delete[] msg;
delete[] msg
是否已取消分配给msg
的所有20个字符或仅截至\0
的字符? \0
,我该怎样强制它删除整个内存块?答案 0 :(得分:10)
您的问题中的原始代码具有未定义的行为,因为您使用delete
new[]
。
我注意到您已将delete
替换为delete[]
:
delete[] msg;
这是正确的,并将取消分配new[]
分配的所有内存。
没有“删除直至\0
”或任何其他此类“部分”删除的概念。只能删除使用new
/ new[]
分配的完整块,因此您的代码就可以了。
答案 1 :(得分:5)
delete[]
运算符删除整个内存块。您无法释放部分内存块 - 您只能解除分配整个块。
new/delete
和malloc/free
的情况也是如此。解除分配函数只能解除分配整个内存块。
答案 2 :(得分:1)
您应该使用delete[]
释放数组。这是你告诉程序查找数组信息并释放整个数组的唯一方法。
使用正常的delete
,编译器可能会认为您只想释放一个指针,但事实并非如此。有关数组大小的额外信息以及无法查找的内容和额外内存将不会被释放。
将数组中的char设置为\0
这一事实没有任何区别,在释放数组时,只考虑已知的数组大小。否则类似于
Class *array = new Class[50];
array[0] = NULL;
delete[] array;
只会泄漏内存。