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