动态大小的原始数组
// Example of raw dynamic size array. It's generally better to use std::vector.
#include <algorithm> // std::sort
#include <iostream>
using namespace std;
auto int_from( istream& in ) -> int { int x; in >> x; return x; }
auto main()
-> int
{
cout << "Sorting n integers provided by you.\n";
cout << "n? ";
int const n = int_from( cin );
int* a = new int[n]; // ← Allocation of array of n items.
for( int i = 1; i <= n; ++i )
{
cout << "The #" << i << " number, please: ";
a[i-1] = int_from( cin );
}
sort( a, a + n );
for( int i = 0; i < n; ++i ) { cout << a[i] << ' '; }
cout << '\n';
delete[] a;
}
声明数组 T a[n];
的程序,其中 n
被确定为运行时,可以使用支持 C99 可变长度数组 (VLA)作为语言扩展的某些编译器进行编译。但标准 C++不支持 VLA。此示例显示如何通过 new[]
-expression 手动分配动态大小数组,
int* a = new int[n]; // ← Allocation of array of n items.
…然后使用它,最后通过 delete[]
-expression 释放它:
delete[] a;
这里分配的数组具有不确定的值,但只需添加一个空括号 ()
即可进行零初始化,如下所示:new int[n]()
。更一般地,对于任意项类型,这执行值初始化。
作为调用层次结构中函数的一部分,此代码不会是异常安全的,因为 delete[]
表达式之前(以及 new[]
之后)的异常会导致内存泄漏。解决该问题的一种方法是通过例如 std::unique_ptr
智能指针自动化清理。但通常更好的解决方法就是使用 std::vector
:这就是 std::vector
的用途。