導入
C++のメモリ管理において、std::unique_ptrは「所有権の排他」を保証する非常に強力なツールです。通常、unique_ptrはコピー禁止であるため、関数に渡す際は「値渡し(移動)」か「ポインタ/参照渡し(所有権の維持)」を行うのが一般的です。しかし、関数内でポインタ先をリセットしたり、動的に割り当て直したりしたい場合には、少し特殊な記法が必要になります。なぜこの「参照渡し」が必要なのか、そしてどのように実装すべきかを解説します。
基礎知識
std::unique_ptrは、特定のスコープが終了した際に自動的にメモリを解放するスマートポインタです。最大の制約は「コピーができない」ことであり、関数に引数として渡す際も、デフォルトでは所有権を移動(std::move)させる必要があります。しかし、所有権を関数側に移動させず、あくまで「関数内でポインタそのものを書き換えたい」というケースでは、unique_ptrの参照(std::unique_ptr
実装/解決策
unique_ptrを引数として受け取る際、std::unique_ptr
サンプルプログラム
以下のコードは、関数内でunique_ptrをリセットし、新しいオブジェクトを割り当てる例です。
#include
include
// unique_ptrを「参照渡し」で受け取る関数
// 引数として渡されたポインタを書き換えることが可能です
void reassign(std::unique_ptr
// 現在のメモリを解放し、新しい値で再確保する
p.reset(new int(200));
std::cout << "関数内で値を更新しました: " << p << std::endl;
}
int main() {
// 100で初期化されたunique_ptrを作成
std::unique_ptr
std::cout << "更新前: " << myPtr << std::endl;
// 参照渡しで関数を呼び出す
reassign(myPtr);
std::cout << "更新後: " << myPtr << std::endl;
return 0;
}
応用・注意点
注意点: 関数の目的が単に「中身の値を読み取るだけ」であれば、std::unique_ptr

コメント