shared_ptrã®ä½¿ãæ¹ãç¥ãããã£ããããããã試ãã¦ã¿ã
ã¿ã¤ãã«ã®ã¨ããã§ãã
åºæ¬çãªä½¿ç¨æ¹æ³
ã¾ãåºæ¬çãªä½¿ãæ¹ã
#include "stdafx.h" #include <memory> #include <iostream> class Hoge { public: Hoge(){} ~Hoge(){ std::cout << "Hogeã®ãã¹ãã©ã¯ã¿ã ã" << std::endl; } int number_; }; int _tmain(int argc, _TCHAR* argv[]) { { std::shared_ptr<Hoge> hoge1(new Hoge); // åæå hoge1->number_ = 30; { std::shared_ptr<Hoge> hoge2 = hoge1; std::cout << "hoge1->number_ : " << hoge1->number_ << std::endl; std::cout << "hoge2->number_ : " << hoge2->number_ << std::endl; } // ããã§hoge2ã¯ã¹ã³ã¼ãããæãããã©hoge1ã¯ã¾ã çãã¦ã std::cout << "hoge1->number_ : " << hoge1->number_ << std::endl; } // ããã§hoge1ãã¹ã³ã¼ãããæããããHogeã®ãã¹ãã©ã¯ã¿ãå¼ã°ãã return 0; }
å®è¡çµæã¯ä»¥ä¸
hoge1->number_ : 30 hoge2->number_ : 30 hoge1->number_ : 30 Hogeã®ãã¹ãã©ã¯ã¿ã ã
ãããªãã¸ã§ã¯ããæã示ããã¤ã³ã¿ããã¹ã¦ãªããªãã¨ãã®ãªãã¸ã§ã¯ãã®ãã¹ãã©ã¯ã¿ãå¼ãã§ãããã£ã¦ãã¨ã¿ããã§ãã
åæåã®ä»æ¹ä»¥å¤ã¯æ®éã®ãã¤ã³ã¿ã®ããã«æ±ãã¾ãã
å½ããåã§ããshared_ptrã使ããªãã¨ã¡ã¢ãªãªã¼ã¯ãçºçãã¾ããã
#include "stdafx.h" #include <memory> #include <iostream> class Hoge { public: Hoge(){} ~Hoge(){ std::cout << "Hogeã®ãã¹ãã©ã¯ã¿ã ã" << std::endl; } int number_; }; int _tmain(int argc, _TCHAR* argv[]) { { Hoge* hoge1= new Hoge; hoge1->number_ = 30; { Hoge* hoge2 = hoge1; std::cout << "hoge1->number_ : " << hoge1->number_ << std::endl; std::cout << "hoge2->number_ : " << hoge2->number_ << std::endl; } std::cout << "hoge1->number_ : " << hoge1->number_ << std::endl; } // ããã§hoge1ãã¹ã³ã¼ããæãããã©ãã¹ãã©ã¯ã¿ã¯å¼ã°ããªã return 0; }
å®è¡çµæ
hoge1->number_ : 30 hoge2->number_ : 30 hoge1->number_ : 30
Hogeã®ãã¹ãã©ã¯ã¿ãå¼ã°ãã¦ããªãã®ãåããã¾ãã
åç §ã¯ãã
åç §ã¯ãããæ®éã®ãã¤ã³ã¿åæ§ã«è¡ãã¾ã
#include "stdafx.h" #include <memory> #include <iostream> class Hoge { public: Hoge(){} ~Hoge(){ std::cout << "Hogeã®ãã¹ãã©ã¯ã¿ã ã" << std::endl; } int number_; }; int _tmain(int argc, _TCHAR* argv[]) { { std::shared_ptr<Hoge> hoge1(new Hoge); hoge1->number_ = 15; Hoge hoge2 = *hoge1; std::cout << "hoge1->number_ : " << hoge1->number_ << std::endl; std::cout << "hoge2.number_ : " << hoge2.number_ << std::endl; std::cout << std::endl << "hoge2.number_ = 3" << std::endl << std::endl; hoge2.number_ = 3; std::cout << "hoge1->number_ : " << hoge1->number_ << std::endl; std::cout << "hoge2.number_ : " << hoge2.number_ << std::endl; } return 0; }
å®è¡çµæ
hoge1->number_ : 15 hoge2.number_ : 15 hoge2.number_ = 3 hoge1->number_ : 15 hoge2.number_ : 3 Hogeã®ãã¹ãã©ã¯ã¿ã ã Hogeã®ãã¹ãã©ã¯ã¿ã ã
use_count()ã§åç §ãã¦ããshared_ptrã®æ°ã調ã¹ã
hoge1->ã¨ããã¨Hogeã¸ã®ãã¤ã³ã¿ã¨ãã¦ä½¿ãã¾ããã
hoge1.ã¨ããã¨shared_ptrã¨ãã¦ã®æ©è½ãå¼ã³åºããã¨ãåºæ¥ã¾ãã
hoge1.use_count()ã§ãªãã¸ã§ã¯ããæã示ãã¦ããshared_ptrã®æ°ãç¥ããã¨ãã§ãã¾ãã
#include "stdafx.h" #include <memory> #include <iostream> class Hoge { public: Hoge(){} ~Hoge(){ std::cout << "Hogeã®ãã¹ãã©ã¯ã¿ã ã" << std::endl; } int number_; }; int _tmain(int argc, _TCHAR* argv[]) { { std::shared_ptr<Hoge> hoge1(new Hoge); hoge1->number_ = 15; std::cout << "hoge1.use_count() : " << hoge1.use_count() << std::endl; std::shared_ptr<Hoge> hoge2 = hoge1; std::cout << "hoge1.use_count() : " << hoge1.use_count() << std::endl; std::cout << "hoge2.use_count() : " << hoge2.use_count() << std::endl; } return 0; }
å®è¡çµæ
hoge1.use_count() : 1 hoge1.use_count() : 2 hoge2.use_count() : 2 Hogeã®ãã¹ãã©ã¯ã¿ã ã
注æããªããã°ãªããªãã®ã¯ã"ããã¢ãã¬ã¹ãæãshared_ptrã®æ°"ã«åºã¥ãã¦ãããããããªãã¦ã"ããshared_ptrãä½åã³ãã¼ãããã"ã«åºã¥ãã¦ã(?)ã£ã¦ãã¨ã§ãã
ããã¾ããã¾ã説æã§ãã¦ããæ°ãããªãã§ãããä½ããããããã¨ããã¨ã次ã®ãããªã³ã¼ããããã¡ãã ãã ãã£ã¦ãã¨ã§ãã
#include "stdafx.h" #include <memory> #include <iostream> class Hoge { public: Hoge(){} ~Hoge(){ std::cout << "Hogeã®ãã¹ãã©ã¯ã¿ã ã" << std::endl; } int number_; }; int _tmain(int argc, _TCHAR* argv[]) { Hoge* hoge = new Hoge; hoge->number_ = 11; std::shared_ptr<Hoge> hoge1(hoge); { std::shared_ptr<Hoge> hoge2(hoge); // åãã¢ãã¬ã¹ãæãshared_ptrãäºã¤ãããã©ã std::cout << "hoge1.use_count() : " << hoge1.use_count() << std::endl; std::cout << "hoge2.use_count() : " << hoge2.use_count() << std::endl; } // ããã§hoge2ãã¹ã³ã¼ããã¬ãã¦ãã¹ãã©ã¯ã¿ãå¼ãã§ãã¾ã! std::cout << hoge1->number_ << std::endl; // åé¤æ¸ã¿ã®é åã«ã¢ã¯ã»ã¹ãããã¨ãã¦ã¨ã©ã¼ã«ãªã return 0; }
hoge1.use_count() : 1 hoge2.use_count() : 1 Hogeã®ãã¹ãã©ã¯ã¿ã ã -572662307 Hogeã®ãã¹ãã©ã¯ã¿ã ã
æå¤ã ã£ãã®ã§ãããåé¤æ¸ã¿ã®é åã®ãã¹ãã©ã¯ã¿ãå¼ã¼ãã¨ããã¨ã¡ããã¨å¼ã°ãããã§ããããªãã¸ã§ã¯ããã©ãããã£ã¦ããããªãã¦åã®æ å ±ããå¼ã°ãããã§ããããã
ãªããããåãã¢ãã¬ã¹ãæãã¦ãã¦ããä»£å ¥ã¨ãã®æ¹æ³ã§æ示çã«åãã§ããã£ã¦ãã¨ãshared_ptrã«ä¼ãã¦ãããªãã¨ãããªãã£ã¦ãã¨ã§ãã
ãã¨ãä»ã¿ãããªã³ã¼ãã¯æ¸ãã¹ããããªãã§ããã
.get()ã§çã®ã¢ãã¬ã¹ãåå¾
hoge1.get()ã§çã®ã¢ãã¬ã¹ãåå¾ã§ããããã§ãã
#include "stdafx.h" #include <memory> #include <iostream> class Hoge { public: Hoge(){} ~Hoge(){ std::cout << "Hogeã®ãã¹ãã©ã¯ã¿ã ã" << std::endl; } int number_; }; int _tmain(int argc, _TCHAR* argv[]) { Hoge* hoge; { std::shared_ptr<Hoge> hoge1(new Hoge); hoge1->number_ = 5; hoge = hoge1.get(); hoge->number_ = 10; // åå¾ããçã¢ãã¬ã¹ãä»ãã¦æä½ std::cout << "hoge1->number_ : " << hoge1->number_ << std::endl; // å¤æ´ãåæ ããã¦ã std::cout << "hoge->number_ : " << hoge->number_ << std::endl; } std::cout << "hoge->number_ : " << hoge->number_ << std::endl; // åé¤æ¸ã¿ã®é åã«ã¢ã¯ã»ã¹ return 0; }
å®è¡çµæ
hoge1->number_ : 10 hoge->number_ : 10 Hogeã®ãã¹ãã©ã¯ã¿ã ã hoge->number_ : -572662307
å½ããåã§ããã.get()ã§çã®ã¢ãã¬ã¹ãåå¾ããããã£ã¦shared_ptrã¯ãããªãã¨ã«ãæ§ããªãã¹ã³ã¼ããæããæç¹ã§ãã¹ãã©ã¯ã¿ãå¼ãã§ããã¾ãã
ãã¾ããã¹ãã©ã¯ã¿ãå¼ãã§ãããªãã¨ã(循ç°åç §)
shared_ptrããã¾ããã¹ãã©ã¯ã¿ãå¼ãã§ãããªããã¨ãããã¾ãã
循ç°åç
§ãåå¨ããã¨ãããã®ãã¹ãã©ã¯ã¿ã¯å¼ã°ããªãããã§ãã
#include "stdafx.h" #include <memory> #include <iostream> class Hoge { public: Hoge(){} ~Hoge(){ std::cout << "Hogeã®ãã¹ãã©ã¯ã¿ã ã" << std::endl; } int number_; std::shared_ptr<Hoge> hoge_; }; int _tmain(int argc, _TCHAR* argv[]) { { std::shared_ptr<Hoge> hoge1(new Hoge); std::shared_ptr<Hoge> hoge2(new Hoge); // 循ç°åç § hoge1->hoge_ = hoge2; hoge2->hoge_ = hoge1; }// ã¹ã³ã¼ããæãã¦ãdeleteãå¼ã°ããªã return 0; }
å®è¡çµæ
(ãã¹ãã©ã¯ã¿ãå¼ã°ãã¦ããªã)
ãªã³ã¯ããªã¹ãã®å é ã¨æ«å°¾ãã¤ãªãã ãããã¨ãããèµ·ããããã§ããã
vectorã«ã¤ã£ããã§ã¿ã
std::vectorã«å ¥ãããããã¨ã(ä»ããåç §ããã¦ããªãããã)eraseããã ãã§ãã¹ãã©ã¯ã¿ãå¼ãã§ããã¾ãã
#include "stdafx.h" #include <memory> #include <iostream> #include <vector> #include <algorithm> #include <functional> class Hoge { public: Hoge(int i) : number_(i){} ~Hoge(){ std::cout << "Hogeã®ãã¹ãã©ã¯ã¿ã ã" << std::endl; } int number_; std::shared_ptr<Hoge> hoge_; }; int _tmain(int argc, _TCHAR* argv[]) { std::vector<std::shared_ptr<Hoge> > hoges; hoges.push_back(std::shared_ptr<Hoge>(new Hoge(0))); hoges.push_back(std::shared_ptr<Hoge>(new Hoge(1))); hoges.push_back(std::shared_ptr<Hoge>(new Hoge(2))); hoges.push_back(std::shared_ptr<Hoge>(new Hoge(3))); hoges.push_back(std::shared_ptr<Hoge>(new Hoge(4))); std::tr1::function<void(std::shared_ptr<Hoge>)> PrintNumbers = [](std::shared_ptr<Hoge> h)->void{std::cout << h->number_ << std::endl;}; std::for_each(hoges.begin(), hoges.end(), PrintNumbers); auto p = hoges.begin(); hoges.erase(p + 2); // ä»ã«åç §ããã¦ããªãã®ã§eraseããæç¹ã§ãã¹ãã©ã¯ã¿ãå¼ã°ãã std::shared_ptr<Hoge> hoge1(hoges.at(1)); hoges.erase(p + 1); // hoge1ãåç §ãã¦ããã®ã§eraseãã¦ããã¹ãã©ã¯ã¿ã¯å¼ã°ããªã std::for_each(hoges.begin(), hoges.end(), PrintNumbers); return 0; }
å®è¡çµæ
0 1 2 3 4 Hogeã®ãã¹ãã©ã¯ã¿ã ã 0 3 4 Hogeã®ãã¹ãã©ã¯ã¿ã ã Hogeã®ãã¹ãã©ã¯ã¿ã ã Hogeã®ãã¹ãã©ã¯ã¿ã ã Hogeã®ãã¹ãã©ã¯ã¿ã ã
.reset()ã§ãªã»ãã
.reset()ãå¼ã¶ã¨ãå¼ãã å¤æ°ããªãã¸ã§ã¯ããæã示ãã¦ããã£ã¦ããæ
å ±ããªã»ãããããåç
§ã«ã¦ã³ããä¸ã¤æ¸ãã¾ãã
.reset()ãå¼ãã ã¨ãã«åç
§ã«ã¦ã³ãã0ã«ãªã£ãããã¹ãã©ã¯ã¿ãå¼ã°ãã¾ããã
#include "stdafx.h" #include <memory> #include <iostream> #include <vector> #include <algorithm> #include <functional> class Hoge { public: Hoge(){} ~Hoge(){ std::cout << "Hogeã®ãã¹ãã©ã¯ã¿ã ã" << std::endl; } int number_; std::shared_ptr<Hoge> hoge_; }; int _tmain(int argc, _TCHAR* argv[]) { { std::shared_ptr<Hoge> hoge1(new Hoge); std::shared_ptr<Hoge> hoge2 = hoge1; hoge1->number_ = 3; hoge1.reset(); std::cout << "hoge2->number_ : " << hoge2->number_ << std::endl; hoge2.reset(); std::cout << "ã¾ã ã¹ã³ã¼ãã¬ãã¦ãªãã" << std::endl; } return 0; }
å®è¡çµæ
hoge2->number_ : 3 Hogeã®ãã¹ãã©ã¯ã¿ã ã ã¾ã ã¹ã³ã¼ãã¬ãã¦ãªãã
ã¡ãã£ã¨åããã«ããã§ããã¹ã³ã¼ããæããåã«.reset()ã§åç §ã«ã¦ã³ãã0ã«ãªããã¹ãã©ã¯ã¿ãå¼ã°ãã¦ããã®ã確èªã§ãã¾ããã
ã¾ã¨ã
ãããªæãã§ããããã
åå¼·ã«ãªãã¾ããã