C++/標準ライブラリ/memory
表示
C++教科書/標準ライブラリ編/<memory>の章
[編集]はじめに
[編集]この章では、C++標準ライブラリに含まれる<memory>ヘッダーについて解説します。このヘッダーは、スマートポインタ、メモリアロケータ、未初期化領域操作といった、メモリ管理に関わる機能を提供します。
スマートポインタ
[編集]std::unique_ptr
[編集]- 排他的所有権を持つスマートポインタ。オブジェクトを1つのポインタのみで管理し、自動的に解放される。
- 以下のメンバ関数を提供します。
get(): 管理しているオブジェクトへのポインタを取得。release(): 所有権を放棄し、ポインタを無効化。reset(): 管理しているオブジェクトを解放し、新しいオブジェクトを管理 (引数で指定)。swap(): 別のstd::unique_ptrオブジェクトと所有権を交換。operator->: 管理しているオブジェクトへのポインタ参照を取得。operator*: 管理しているオブジェクトへの直接アクセス。
std::shared_ptr
[編集]- 共有所有権を持つスマートポインタ。オブジェクトを複数のポインタで管理し、参照カウントに基づいて自動的に解放される。
- 以下のメンバ関数を提供します。
get(): 管理しているオブジェクトへのポインタを取得。weak_ptr lock(): 弱参照を取得。use_count(): 参照カウントを取得。reset(): 管理しているオブジェクトを解放し、新しいオブジェクトを管理 (引数で指定)。swap(): 別のstd::shared_ptrオブジェクトと所有権を交換。operator->: 管理しているオブジェクトへのポインタ参照を取得。operator*: 管理しているオブジェクトへの直接アクセス。
std::weak_ptr
[編集]- 弱参照を持つスマートポインタ。
std::shared_ptrオブジェクトを非所有的に参照し、循環参照を防ぐ。 - 以下のメンバ関数を提供します。
lock(): ロックして、共有所有権を持つスマートポインタを取得 (有効な場合のみ)。expired(): 参照しているオブジェクトが解放済みかどうかを確認。operator->: 参照しているオブジェクトへのポインタ参照を取得 (有効な場合のみ)。operator*: 参照しているオブジェクトへの直接アクセス (有効な場合のみ)。
メモリアロケータ
[編集]std::allocator
[編集]- メモリ割り当てと解放を管理するテンプレートクラス。
- 以下のメンバ型とメンバ関数を提供します。
value_type: 割り当てられるオブジェクトの型。pointer: 割り当てられたオブジェクトへのポインタ型。reference: 割り当てられたオブジェクトへの参照型。size_type: メモリサイズの型。allocate(size_type n):n個のオブジェクトを格納できるメモリ領域を割り当てる。deallocate(pointer p, size_type n):pを先頭とするn個のオブジェクトが格納されていたメモリ領域を解放。max_size(): 最大で割り当て可能なオブジェクト数を取得。construct(pointer p, const T& val):pを指すオブジェクトをvalで初期化する。destroy(pointer p):pを指すオブジェクトを破棄。
その他のメモリアロケータ
[編集]std::pmalloc: プラットフォーム固有のメモリ管理機能を利用するロケータ。std::uninitialized_allocator: 未初期化領域を割り当てるロケータ。
未初期化領域操作
[編集]std::uninitialized_value_construct
[編集]- 未初期化領域にオブジェクトを構築する。
- 構文:
std::uninitialized_value_construct(ptr, args...)ptr: 未初期化領域のポインタ。args: コンストラクタ引数。
std::uninitialized_copy
[編集]- 未初期化領域にデータをコピーする。
- 構文:
std::uninitialized_copy(first, last, ptr)first: コピー元の先頭イテレータ。ptr: 未初期化領域のポインタ。
std::uninitialized_fill
[編集]- 未初期化領域を値で埋める。
- 構文:
std::uninitialized_fill(first, last, val)first: 塗りつぶしの開始位置のイテレータ。last: 塗りつぶしの終了位置のイテレータ。val: 塗りつぶしに使用する値。
その他の機能
[編集]<memory>ヘッダーは、上記以外にも以下の機能を提供します。
std::addressof: スマートポインタが管理するオブジェクトのアドレスを取得。std::raw_ptr_cast: スマートポインタを生のポインタにキャスト。std::exchange: スマートポインタの所有権を交換。std::make_unique: 新しいstd::unique_ptrオブジェクトを作成。std::make_shared: 新しいstd::shared_ptrオブジェクトを作成。
まとめ
[編集]<memory>ヘッダーは、C++におけるメモリ管理を安全かつ効率的に行うための強力なツールを提供します。スマートポインタ、メモリアロケータ、未初期化領域操作を活用することで、メモリリークや野良ポインタといった問題を回避し、コードの保守性とパフォーマンスを向上させることができます。