我已经看到了显示动态数组的基本用法的示例
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;
}
创建静态数组并让用户定义其大小。那么示例显示的动态数组有什么优势呢?
答案 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::vector
和std::unique_ptr
解决方案可以使缓冲区比当前范围更长。
未来版本的C ++的另一个解决方案是std::dynarray<int>
,它代表一个值语义缓冲区。与int array[n]
类似,它的缓冲区不能超出当前作用域的末尾,但至少它可以从函数返回(并复制其数据)而不会跳过箍。
自动存储解决方案的另一个问题是堆栈空间有时比堆空间(免费存储)更受限制。所以在堆栈上粘贴大量的东西是危险的。此外,还有一些方法可以捕获堆上的分配失败,但是C / C ++中的堆栈溢出保护不那么健壮。
int array[n]
的最后一个问题是C样式数组在传递给函数之类时会有奇怪的语义(带有指针衰减),有时会妨碍它们。
答案 1 :(得分:1)
可变长度数组是GCC extension。所以,你的代码不便携。选择合适的STL容器是一个好习惯,除非开销是绝对不可接受的。在这种情况下,请坚持使用您的第一个代码段。