「C++の基礎 - スマートポインタ(weak ptr)」の版間の差分

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

ページの作成:「== 概要 == C++11では、unique_ptr<T>、shared_ptr<T>、weak_ptr<T>の3種のスマートポインタが追加された。<br> これらのスマートポインタは…」
 
48行目: 48行目:
具体的な使い方を見てみる。<br>
具体的な使い方を見てみる。<br>
weak_ptr<T>は shared_ptr<T>が所有権を持つメモリしか管理できない。<br>
weak_ptr<T>は shared_ptr<T>が所有権を持つメモリしか管理できない。<br>
<source lang="c++">
// コンストラクタや代入演算子でshared_ptrを受け取る
std::shared_ptr<T> sptr = std::make_shared<int>(10);
std::weak_ptr<T> wptr1(sptr);
std::weak_ptr<T> wptr2;
wptr2 = sptr;
// ポインタを直接受け取ることはできない
// std::weak_ptr<T> wptr3(new int(10)); // コンパイルエラー
</source>
<br>
<source lang="c++">
// weak_ptr<T>は、コピー、ムーブともに使用することができる。
std::shared_ptr<int> sptr = std::make_shared<int>(10);
std::weak_ptr<int> wptr1(sptr);
// コピーコンストラクタやコピー代入演算子も可能
std::weak_ptr<int> wptr2(wptr1);
std::weak_ptr<int> wptr3;
wptr3 = wptr1;


// ムーブコンストラクタやムーブ代入演算子も可能
// この時、wptr2とwptr3は参照を失う
std::weak_ptr<int> wptr4(std::move(wptr2));
std::weak_ptr<int> wptr5;
wptr5 = std::move(wptr3);
</source>
<br>
<source lang="c++">
// 参照の開放は、デストラクタやreset関数を使う
std::shared_ptr<int> sptr = std::make_shared<int>(10);
{
    std::weak_ptr<int> wptr1(sptr);
} // デストラクタで参照を開放
std::weak_ptr<int> wptr2(sptr);
// reset関数で明示的に解放
wptr2.reset();
</source>
<br>
<source lang="c++">
// 所有権はそもそも保持していないので、operator bool()は使用できない
std::shared_ptr<int> sptr = std::make_shared<int>(10);
std::weak_ptr<int> wptr(sptr);
// 参照先が解放されているか確認するには、expired()を使う(戻り値がtrueの場合は解放されている)
if(wptr.expired())
{
    std::cout<<"expired"<<std::endl;
}
// use_count関数を使って、参照先のメモリに所有権を持つshared_ptr<T>の数を調べることができる
std::cout << "use_count = " << wptr.use_count() << std::endl;
</source>
<br>
<source lang="c++">
// 参照するメモリにアクセスするのに、operator*()やoperator->()は使用できない
// メモリにアクセスするためには、まず、lock()によって参照先を保持するshared_ptr<T>を取得し、そこからアクセスする
// これは、使用中に解放されてしまうのを避けるためである。
std::shared_ptr<int> sptr = std::make_shared<int>(10);
std::weak_ptr<int> wptr(sptr);
{
    // lock関数によって、参照先を保持するshared_ptrを取得する
    std::shared_ptr<int> ptr = wptr.lock();
}
</source>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:C++]]
[[カテゴリ:C++]]