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++におけるメモリ管理を安全かつ効率的に行うための強力なツールを提供します。スマートポインタ、メモリアロケータ、未初期化領域操作を活用することで、メモリリークや野良ポインタといった問題を回避し、コードの保守性とパフォーマンスを向上させることができます。