【问题标题】:Does delete[] deallocate the entire block of memory?delete[] 会释放整个内存块吗?
【发布时间】:2012-11-21 05:30:39
【问题描述】:

考虑以下几点:

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

【问题讨论】:

  • 当然不是。如果是这样,你不能分配除字符串以外的任何东西。

标签: c++ arrays char delete-operator


【解决方案1】:

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

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

delete[] msg;

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

不存在“删除到\0”或任何其他此类“部分”删除的概念。只有 complete 块分配有new/new[] 可以被删除,所以你的代码没问题。

【讨论】:

  • 在许多实现中(例如clang的libstdc++),newnew[]malloc的同义词,deletedelete[]free的同义词。这意味着它不会在这些情况下产生影响。
  • @RichardJ.RossIII:首先,new 不能与 malloc 同义,因为它具有不同的语义(调用构造函数)。即使这三个基于相同的分配器,这也不会改变技术上行为未定义的事实。我可以向您展示许多其他示例,这些示例碰巧在某些平台上使用某些编译器工作,但它们依赖于未定义的行为,因此不可移植。
  • @Richard J. Ross III:即使new/delete 在下面使用malloc/free,前者会为您调用构造函数/析构函数,而后者不会。这是语义上的显着差异。
  • @RichardJ.RossIII 这就像说xyz 实现垃圾收集,所以你永远不需要使用delete。它有什么相关性?
  • @RichardJ.RossIII:即使这些操作如何分配内存的特定内部细节仍然不相关:有 new 和 new[](以及 delete/delete[])之间的巨大差异,它们与内存分配本身无关。请不要提供不完整、不准确或明显错误的答案或 cmets。它伤害了所有人——包括你自己。
【解决方案2】:

delete[] 运算符删除整个内存块。您不能释放部分内存块 - 您只能释放整个块。

new/deletemalloc/free 也是如此。释放函数只能释放整个内存块。

【讨论】:

    【解决方案3】:

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

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

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

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

    只会泄漏内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 2012-09-24
      • 2019-10-25
      • 1970-01-01
      • 2015-10-26
      • 2012-01-07
      相关资源
      最近更新 更多