C++教科書/標準ライブラリ編/<new>の章

編集

はじめに

編集

<new> ヘッダーは C++ の標準ライブラリの一部であり、メモリ管理のための低レベルな機能を提供します。主に、プログラムの実行中にメモリを動的に割り当てたり解放したりするための仕組みを扱います。

ヘッダーの内容

編集

<new> ヘッダーには以下のようなものが含まれています。

クラス
bad_alloc
メモリ割り当てが失敗したときにスローされる例外
bad_array_new_length (C++11 以降)
無効なサイズで配列を割り当てようとするとスローされる例外
align_val_t (C++17 以降)
整列アライメントを指定するために使用する型
列挙型
new_handler
新しいメモリ割り当て処理を設定するための関数ポインタ型
タグ
nothrow_t
メモリ割り当ての際に例外をスローしないことを指定するためのタグ
destroying_delete_t (C++20 以降)
operator delete の破壊的削除オーバーロードを選択するためのタグ
定数
hardware_destructive_interference_size (C++17 以降)
ハードウェアによる偽の共有 (false sharing) を回避するための最小オフセット値
hardware_constructive_interference_size (C++17 以降)
ハードウェアによる真の共有 (true sharing) を促進するための最大オフセット値
関数
operator new / operator new[]
メモリを割り当てるための演算子
operator delete / operator delete[]
メモリを解放するための演算子
get_new_handler (C++11 以降)
現在設定されている new ハンドラーを取得する関数
set_new_handler
新しい new ハンドラーを設定する関数
launder (C++17 以降)
ポインタの最適化のためのバリア関数 (テンプレート)

機能の詳細

編集

<new> ヘッダーの主な機能はメモリ割り当てと解放です。プログラムは operator new を使ってメモリを割り当て、 operator delete を使って解放します。これらの演算子はいくつかのバリエーションを持ち、メモリサイズやアライメント (境界揃え) 、例外の有無などを指定できます。

また、<new> ヘッダーは以下のような機能も提供します。

new ハンドラー
メモリ割り当てに失敗した場合に呼び出される関数を設定できます。
アライメント
メモリを特定の境界に合わせて割り当てることができます。
nothrow メモリ割り当て
メモリ割り当てが失敗しても例外をスローせずに nullptr を返すようにすることができます。
ハードウェアによるメモリ干渉
ハードウェアアーキテクチャに依存したメモリアクセス特性を利用して、パフォーマンスを向上させることができます。

注意点

編集

<new> ヘッダーを使う際には、メモリ管理を正しく行うことが重要です。メモリを割り当てたら、必ず解放するようにし、メモリリーク (解放されずに残ったメモリ) を避けるように注意が必要です。また、プログラムがメモリ不足になったときに予期しない動作を起こす可能性があるため、適切なエラーハンドリングを行うようにしましょう。