delete[]是否释放整个内存块?

6
请看以下内容:
char* msg = new char[20]; 
msg[4] = '\0'; 
delete[] msg; 
  1. delete[] msg是否释放了为msg分配的全部20个字符,还是只释放了到\0为止的部分?
  2. 如果它只释放了到\0为止的部分,我该如何强制它删除整个内存块?

当然不是。如果是这样,你就只能分配字符串了。 - qwertz
3个回答

10

您提供的代码在问题中存在未定义的行为,因为您正在使用deletenew[]

我注意到您已经通过将delete替换为delete[]来修复了它:

delete[] msg;

这是正确的,将释放由new[]分配的所有内存。

没有“删除到\0”或任何其他“部分”删除的概念。只有使用new/new[]分配的完整块可以被删除,因此您的代码是没问题的。


在许多实现中(例如clang的libstdc++),newnew[]malloc同义,而deletedelete[]则对应于free。这意味着在这些情况下不会有任何区别。 - Richard J. Ross III
好的,我已经修改了,现在呢? - URL87
1
@RichardJ.RossIII:首先,new不能与malloc同义,因为它具有不同的语义(调用构造函数)。即使这三个基于相同的分配器,这也无法改变技术上行为是未定义的事实。我可以向你展示很多其他例子,在某些平台上使用某些编译器可能有效,但依赖于未定义的行为,因此不可移植。 - NPE
1
@Richard J. Ross III:即使new/delete在底层使用malloc/free,前者会为您调用构造函数/析构函数,而后者则不会。这在语义上是一个重大的区别。 - In silico
2
@RichardJ.RossIII 这就像是说*有一个实现可以进行垃圾回收,所以你永远不需要使用delete*。这有什么相关性吗? - Praetorian
4
即使操作内部详细分配内存的方式相同,仍然与该问题无关:new和new[](以及delete/delete[])之间存在巨大的差异,它们与内存分配本身无关。请勿提供不完整、不准确或明显错误的答案或评论。这会对所有人产生不利影响,包括你自己。 - Nik Bougalis

5
delete[] 操作符会删除整个内存块。您不能释放部分内存块,只能释放整个块。

new/deletemalloc/free 也是这样。释放内存的函数只能释放整个内存块。


1

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

使用普通的delete,编译器可能会认为您只想释放单个指针,但实际情况并非如此。关于数组大小和其他信息的额外信息将不会被查找,也不会释放额外的内存。

即使您将数组中的char设置为\0,也没有任何区别。释放数组时,只考虑已知的数组大小。否则,类似以下内容的任何内容都是相似的:

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

只会泄漏内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接