厳密に言えば、標準によれば、オブジェクトはスタックまたはヒープ上に存在する必要はありません。標準では 3 種類の「保存期間」が定義されていますが、保存方法を正確に示していません。
- 静的保存期間
- 自動保存期間
- 動的保存期間
自動保存期間は通常 (ほぼ常に) スタックを使用して実装されます。
動的ストレージ期間は通常、ヒープを使用して (最終的には を介してmalloc()
) 実装されますが、これはコンパイラのユーザーによってもオーバーライドできます。
静的ストレージ期間は、一般にグローバル (または静的ストレージ) と呼ばれるものです。
標準では、これらのことについて次のように述べています (以下は、3.7 のさまざまな部分からの抜粋です - Storage Duration)。
静的および自動保存期間は、宣言 (3.1) によって導入され、実装 (12.2) によって暗黙的に作成されるオブジェクトに関連付けられます。動的ストレージ期間は、演算子 new (5.3.4) で作成されたオブジェクトに関連付けられています。
...
動的保存期間もローカルでもないすべてのオブジェクトには、静的保存期間があります。これらのオブジェクトのストレージは、プログラム (3.6.2、3.6.3) の期間中持続するものとします。
...
auto または register を明示的に宣言したローカル オブジェクト、または static または extern を明示的に宣言していないローカル オブジェクトは、自動ストレージ期間を持ちます。これらのオブジェクトのストレージは、それらが作成されたブロックが終了するまで続きます。
...
オブジェクトは、プログラムの実行中に動的に作成され (1.9)、new 式を使用して (5.3.4)、delete 式を使用して破棄されます (5.3.5)。AC++ 実装は、グローバル割り当て関数 operator new および operator new[] と、グローバル割り当て解除関数 operator delete および operator delete[] を介して、動的ストレージへのアクセスと管理を提供します。
...
ライブラリは、グローバル割り当ておよび割り当て解除関数のデフォルト定義を提供します。一部のグローバル割り当ておよび割り当て解除関数は置き換え可能です (18.4.1)
そして最後に(サンプルクラスの配列に関して):
3.7.4 サブオブジェクトの期間 [basic.stc.inherit]
メンバー サブオブジェクト、基底クラス サブオブジェクト、および配列要素の保存期間は、それらの完全なオブジェクトの保存期間 (1.8) です。