動態大小的原始陣列
// 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
的用途。