动态大小的原始数组

// 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 的用途。