【问题标题】:delete[] Array of characters [duplicate]删除 [] 字符数组 [重复]
【发布时间】:2011-09-26 11:01:16
【问题描述】:

可能重复:
delete[] supplied a modified new-ed pointer. Undefined Behaviour?

假设我使用new char[number] 分配了一些字符。

是否可以只删除几个结束字符(例如delete[] (charArray + 4);,据说会取消分配除前四个字符之外的所有字符)?

我读到一些实现的new[] 存储在对象数组之前分配的对象数量,以便delete[] 知道要取消分配多少对象,所以按照我的要求做可能是不安全的。 .

谢谢。

编辑:

使用单独的 delete 语句手动删除不需要的结束字节是一种安全的方式来完成我的要求吗?

【问题讨论】:

    标签: c++ memory new-operator delete-operator


    【解决方案1】:

    不,您必须使用 delete[] 与使用 new[] 返回的指针完全相同。

    【讨论】:

      【解决方案2】:

      您不能删除数组的特定段。

      如果您只是对 C 字符串进行操作,则可以将一个字符设置为 \0,并且任何对该字符串进行操作的函数都会停在那里,因为 C 字符串是以空值结尾的。

      如果您确实需要释放内存,最接近的方法是创建一个新的、较小的数组,复制元素,然后delete[] 旧数组。

      char* TenCharactersLong = new char[10];
      // ...
      char* FirstFiveCharacters = new char[5];
      for (std::size_t Index = 0; Index < 5; Index++)
      {
          FirstFiveCharacters[Index] = TenCharactersLong[Index];
      }
      delete[] TenCharactersLong;
      

      【讨论】:

        【解决方案3】:

        唯一“安全”的方法是分配一个新数组,复制数据,然后删除旧数组。或者您可以按照std::vector 的方式区分“容量”(数组的大小)和“大小”(其中的元素数量)。

        【讨论】:

        • 你能在std::vector的路上多解释一下吗?
        • @myrkos 它分配空间来存储 n 个元素,但它可能会将其大小报告为 。这是为了更有效地调整大小。
        • @myrkos:它使用::operator new 分配“原始”空间,然后使用放置new 将该原始空间转换为对象。当它需要销毁对象时(例如,当 vector 超出范围或您的 erase 元素时)它会直接调用 dtor 来执行此操作。
        【解决方案4】:

        不,对不起。内存分配足够复杂,包括碎片、对齐、填充、开销等等。像这样的功能只会进一步放大这些问题。

        使用单独的删除语句手动删除不需要的结束字节是一种安全的方式来完成我的要求吗?

        甚至不要尝试。这可能很危险。始终使用 delete [] 释放数组。

        我强烈建议阅读有关此主题的 C++ FAQ Lite:16.1316.14

        【讨论】:

          【解决方案5】:

          不行,你只能删除整个数组。

          【讨论】:

            【解决方案6】:

            不,你不能那样做。我建议为此使用 std::vector 。通过这种方式,您可以查明要删除的索引,然后让库为您处理。

            【讨论】:

              猜你喜欢
              • 2011-03-24
              • 1970-01-01
              • 2016-09-30
              • 1970-01-01
              • 2012-05-09
              • 2012-09-15
              • 2017-12-30
              • 2015-08-28
              • 1970-01-01
              相关资源
              最近更新 更多