6

考虑以下:

char* msg = new char[20]; 
msg[4] = '\0'; 
delete[] msg; 
  1. 是取消分配分配给的所有 20 个字符还是仅delete[] msg分配给 的那些?msg\0
  2. 如果它只释放到\0,我怎么能强制它删除整个内存块?
4

3 回答 3

10

您问题中的原始代码具有未定义的行为,因为您使用的是deletewith new[]

我注意到您已通过将其替换deletedelete[]

delete[] msg;

这是正确的,并且将释放所有已分配的内存new[]

没有“删除直到\0”或任何其他此类“部分”删除的概念。只有用/分配的完整块才能被删除,所以你的代码很好。newnew[]

于 2012-12-03T17:26:46.093 回答
5

操作员删除整个delete[]内存块。您不能释放部分内存块 - 您只能释放整个块。

对于new/delete和也是如此malloc/free。释放函数只能释放整个内存块。

于 2012-12-03T17:28:15.783 回答
1

您应该使用delete[]释放数组。这是您可以告诉程序查找数组信息并能够释放整个数组的唯一方法。

在正常情况delete下,编译器可能会认为您只想释放一个指针,但事实并非如此。有关数组大小的额外信息以及不会被查找的任何内容,并且不会释放额外的内存。

您在数组中设置一个 char 的事实\0 没有任何区别,当释放数组时,只考虑数组的已知大小。否则任何类似于

Class *array = new Class[50];
array[0] = NULL;
delete[] array;

只会泄漏内存。

于 2012-12-03T17:27:38.650 回答