C++ 动态大小的原始数组

示例

//原始动态尺寸数组示例。通常最好使用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];       // ←分配n个项目的数组。
    
    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];       // ←分配n个项目的数组。

…然后使用它,最后通过delete[]-expression释放它:

delete[] a;

此处分配的数组具有不确定的值,但是可以通过添加空括号将其初始化为零(),如下所示:new int[n]()。更一般而言,对于任意项类型,这将执行值初始化

作为调用层次结构中函数的一部分,该代码将不是异常安全的,因为在delete[]表达式之前(和之后new[])的异常会导致内存泄漏。解决该问题的一种方法是通过例如std::unique_ptr智能指针自动进行清理。但是解决该问题的一种更好的方法通常是使用std::vector:std::vector。