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