【问题标题】:Null terminating int arrays空终止 int 数组
【发布时间】:2011-10-29 08:37:12
【问题描述】:

如果我想在 C++ 中动态创建一个 int 数组,然后再将其删除,是否需要 null 终止该 int 数组?如果是这样,我该怎么做?如果不是,计算机如何知道要释放多少内存?

int *array = new int[x];
..do some stuff..
delete array;

我知道对于一个 char 数组,它最多删除一个空字符 ('\0'),如果你的字符串中没有终止空字符,你可能会遇到内存冲突错误,但这如何适用于整数数组(和其他数组,如结构数组)?

【问题讨论】:

  • "如果我想在 C++ 中动态创建一个 int 数组,然后稍后将其删除" 你不应该这样做。您应该使用为您管理内存的std::vector<int>,或者使用std::unique_ptr<int[]>/std::shared_ptr<int[]>/boost::shared_array<int>/boost::scoped_array<int>,这将在正确的时间销毁数组。
  • "我知道对于一个 char 数组,它最多删除一个空字符 ('\0')" 这根本不是真的;你为什么这么认为?
  • 嗯,我觉得说你不应该这样做有点过分了。总的来说,我同意你的看法,但有时你想使用低级 C - 例如速度或与使用数组作为函数参数的库进行交互。是的,尽可能使用类库——在大多数情况下,便利性和安全性胜过过度优化速度,但不是全部。
  • @iandotkelly:C 数组比向量快。并且使用&v[0],您可以直接访问包含在其中的接受指针的函数的数组。
  • @Benjamin Lindley - 只是出于好奇(来自 C、C# 和 Objective-C 程序员的真正问题)您可以通过引用将更改其内容的函数来传递底层数组吗?如果是这样,如果那仍然安全,我印象深刻。即使在这个时代,仍然认为了解 C 数组的工作原理是值得的 ;-)

标签: c++ arrays memory


【解决方案1】:

您的数组使用的内存块中有一些额外的数据,这些数据对您的程序不直接可见,它告诉delete该块有多大。

顺便说一句,你所说的 char 数组是不正确的 - NUL 终止符的存在与 delete 无关 - 它使用隐藏块大小,就像任何其他内存块一样。

(顺便说一句,删除数组时应该说delete [] array;。)

【讨论】:

  • 谢谢!删除数组和删除[]数组有什么区别?
  • @Sam: delete [] 知道如何为数组的每个成员调用析构函数,而普通的 delete 不知道。
  • Delete[] 也会清理元素计数。定期删除是错误的。
【解决方案2】:

如果你用new[]分配一个数组,你只需要用delete[]释放它。

如果您分配的类型具有重要的析构函数,则编译器需要跟踪分配的大小和计数。

对于字符串,空终止符是用于确定字符串的长度,而不是确定底层内存分配的大小。

【讨论】:

  • 编译器不跟踪数组的大小。在我的回答下查看基思的评论
  • @Shredder,编译器生成的代码添加了跟踪信息,以便稍后在new[] 返回的指针上调用delete[] 时调用正确数量的析构函数。我不想那么冗长,所以我将解释缩短为“需要编译器来跟踪大小和计数”。如果你查看 operator new[] 的返回值和 new type[...] 结果的指针,你会发现它并不总是相同的值。不同之处在于编译器将数组的计数放在哪里。
【解决方案3】:

如果您使用运算符new[] 分配任何类型的数组,例如int array[5] = new int[5];,那么您将始终可以使用运算符delete[] 删除它(注意:不是@987654324 @),如delete[] array;

编译器通过隐藏一些关于数组长度的额外信息来实现这一点,通常就在它开始之前。使用此信息,操作员delete[] 可以准确判断要删除多少内存。

另请注意,NUL 终止符与此无关 - 对于 char 数组,该过程的工作方式与任何其他类型的数组完全相同。

总而言之 - 您不需要数组的终止符(任何类型,intchar 或其他)。如果你用new[]分配它,你可以用delete[]释放它。

【讨论】:

    【解决方案4】:

    数组的大小总是已知的。在您的代码中,无论x 的值是多少,数组的大小都是如此,因此程序知道要释放多少内存。

    【讨论】:

    • 这个答案在几个方面是错误的。编译器将 C++ 代码转换为机器代码,然后就完成了。它不会释放内存,因为程序运行时它没有运行。此外,除非 x 是常量,否则编译器不知道 x 是什么,因为 x 在程序运行之前不会得到值。
    • 我不是说编译器,我是说程序。我说的是运行时。抱歉,我编辑了
    【解决方案5】:

    我知道对于一个 char 数组,它最多删除一个空字符 ('\0'),如果你的字符串中没有终止空字符,你可能会遇到内存冲突错误,但这如何适用于整数数组(和其他数组,如结构数组)?

    这可能是因为 C++ 内部恰好在 '\0' 字符处崩溃。

    对于数组,使用:

    delete [] array;
    

    C++ 处理数组的大小以及删除多少。

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 1970-01-01
      • 2013-08-28
      • 2012-04-20
      • 1970-01-01
      • 2013-10-22
      • 1970-01-01
      • 2012-03-06
      • 2023-03-15
      相关资源
      最近更新 更多