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

C++ 某些(简单)示例中的动态数组优势,c++,arrays,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; } 创建

我看到过这样的例子,展示了动态数组的基本用法

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;

}

创建静态数组并让用户定义其大小。那么动态数组的优点是什么?

< P>第一个是C++编码风格差。更好的解决方案是:

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

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

  return 0;
}
intmain(){
int n;
标准:cin>>n;
std::vector数组(n);//或std::unique_ptr数组(new int[n]);
返回0;
}
这将为您提供RAII和明确的缓冲区所有权

<>你给出的第二个例子不是合法的C++。您的编译器可能支持将其作为扩展(可能是因为将来的建议,可能是因为与C兼容,也可能是因为其他任何原因)。有一些建议将这个语法添加到未来的C++版本中。在现行标准下是合法的C,但C++不是C.</P>的超集。 在建议的版本中,
int-array[n]
在自动存储中创建一个数组,当当前作用域结束时,该数组将超出作用域。这意味着它必须存在于一个作用域内,并且不能超过该作用域的生存期——上面的
std::vector
std::unique_ptr
解决方案可以使缓冲区超过当前作用域

另一种未来版本C++的解决方案是:代码> STD::DyNalds/COD>,它代表了一个值语义缓冲区。像

int-array[n]
一样,它的缓冲区不能超出当前作用域的末尾,但至少可以从函数返回它(并复制它的数据),而无需跳转

自动存储解决方案的另一个问题是,堆栈空间有时比堆空间(空闲存储)有限得多。因此,在堆栈上粘贴大量材料是危险的。此外,还有一些方法可以捕获堆上的分配失败,但在C/C++中防止堆栈溢出的保护不太可靠


int-array[n]
的最后一个问题是,当传递给函数等(指针衰减)时,C样式的数组具有奇怪的语义,这有时会造成阻碍。因此,您的代码不可移植。最好选择一个合适的STL容器,除非开销绝对不可接受。在这种情况下,坚持你的第一个代码片段。< /p>第二个是无效的C++。你可以吗?提供的索引应该是常量,因此它不应该真正起作用。除此之外,它还与堆栈和堆有关,可以在几乎所有地方(包括堆栈溢出)上读取更多信息。“第二个不是有效的C++”,但是它编译时没有警告——GCC 4.8-1“,但是它编译…”,这不会告诉你它是否是有效的C++。编译器扩展和所有…注意:在当前的C标准下,它是可选的。C11将其状态从必需更改为可选。