## 4.3 メモリー管理の問題

標準 C++ ライブラリのコンテナには、さまざまな種類の要素を維持することができます。これには、基本的なデータ型 (`integer`、`char` など)、ポインタ、ユーザー定義の型などが含まれます。参照を保持することはできません。一般的に、メモリー管理はアロケータのテンプレートパラメータ型で、標準的なコンテナクラスによって自動的に処理されます。

アロケータの型は、コンテナを宣言するときに、2 番目のテンプレートパラメータとして指定することができます。アロケータのテンプレートパラメータを明示的に指定する場合は、その型と包含される型を一致させる必要があります。デフォルトでは、すべてのコンテナでデフォルトの標準アロケータを使用します。ユーザー定義のアロケータについては、15.3 節を参照してください。

値は、コピーコンストラクタの使用によりコンテナに配置されます。コンテナに対する一部の演算では、デフォルトのコンストラクタが必要です。コンテナへのコピーを行う `copy()` のような汎用アルゴリズムは、代入演算子を使用します。

たとえば、コンテナ全体がコピーコンストラクタの呼び出しまたは代入によって複製される場合、各値は、すべてのコピーコンストラクタまたは代入演算子のいずれかを使用して、新しい構造にコピーされます。高水準なコピーや低水準なコピーのいずれでも、必要とされる意味が何であっても、代入演算子を提供できるプログラマによって制御されます。さまざまなコンテナクラスによって内部的に使用される構造のメモリーの割り当てや開放は、自動的に効率よく行われます。

デストラクタが要素の型として定義されている場合、値がコンテナから削除されると、デストラクタが呼び出されます。コレクション全体が破壊された場合、コンテナで保持される残りの値ごとにデストラクタが呼び出されます。

ここで、ポインタ値を保持するコンテナについて簡単に説明します。このようなコレクションは珍しいものではありません。たとえば、ポインタのコレクションは、クラスのインスタンスまたはサブクラスのインスタンスのいずれかを潜在的に表現できる値を格納するための唯一の方法です。このようなコレクションは、11.3 節で説明する問題の例で使用されています。

このような場合、コンテナの役割はポインタ値自体を維持することだけです。ポインタから参照される値のメモリーを管理することは、プログラマの責任です。これには、通常は演算子 `new` の呼び出しによる、記憶領域の値が正しく割り当てられていること、コンテナが値への参照を保持している間は開放されないこと、コンテナから削除されると正しく開放されることなどの確認が含まれます。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月