📢 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++]] | ||