某些(简单)示例中的动态数组优势

时间:2014-07-08 23:56:43

标签: c++ arrays

我已经看到了显示动态数组的基本用法的示例

int main()
{

   int n;
   int *array;       

   std::cin >> n;

   array = new int[n];

   delete [] array;

   return 0;

}

但我能做到

int main()
{

   int n;

   std::cin >> n;

   int array[n];

   return 0;

}

创建静态数组并让用户定义其大小。那么示例显示的动态数组有什么优势呢?

2 个答案:

答案 0 :(得分:2)

首先是糟糕的C ++编码风格。更好的解决方案是:

int main() {
  int n;
  std::cin >> n;

  std::vector<int> array(n); // or std::unique_ptr<int[]> array( new int[n] );

  return 0;
}

为您提供RAII和清除缓冲区所有权。

您提供的第二个示例不是合法的C ++。您的编译器可能会将其作为扩展名支持(因为未来的提案,因为与C的兼容性,或者出于其他原因)。有人建议将此语法添加到未来的C ++版本中。根据当前标准,它是合法的C,但C ++不是C的超集。

在建议的版本下,int array[n]在自动存储中创建一个当前作用域结束时超出范围的数组。这意味着它必须存在于范围内,并且不能超过该范围的生命周期 - 上面的std::vectorstd::unique_ptr解决方案可以使缓冲区比当前范围更长。

未来版本的C ++的另一个解决方案是std::dynarray<int>,它代表一个值语义缓冲区。与int array[n]类似,它的缓冲区不能超出当前作用域的末尾,但至少它可以从函数返回(并复制其数据)而不会跳过箍。

自动存储解决方案的另一个问题是堆栈空间有时比堆空间(免费存储)更受限制。所以在堆栈上粘贴大量的东西是危险的。此外,还有一些方法可以捕获堆上的分配失败,但是C / C ++中的堆栈溢出保护不那么健壮。

int array[n]的最后一个问题是C样式数组在传递给函数之类时会有奇怪的语义(带有指针衰减),有时会妨碍它们。

答案 1 :(得分:1)

可变长度数组是GCC extension。所以,你的代码不便携。选择合适的STL容器是一个好习惯,除非开销是绝对不可接受的。在这种情况下,请坚持使用您的第一个代码段。