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