C++11 ã¹ãã¼ããã¤ã³ã¿ã®è©±
C++ã«ã¯ã¬ã¼ãã¸ã³ã¬ã¯ã¿ãè¨èªçã«ã¯åå¨ããªãã®ã§ãåçã«ç¢ºä¿ãããªãã¸ã§ã¯ãã®ã¡ã¢ãªã®ç®¡çã¯ããã°ã©ãã責任ãæã£ã¦ç®¡çããªããã°ãã¡ã¢ãªãªã¼ã¯ã»ãªã½ã¼ã¹ãªã¼ã¯ãªã©ã®åé¡ãçãã¦ãã¾ãã¾ãã
Â
仿ã®ããã°ã©ãã¯ããããåé¡ãå¼ãèµ·ãããªã¹ã¯ãæ¸ããçºã«ãè¨è¿°ãã¹ã®èµ·ãããããçã®ãã¤ã³ã¿ã使ãèªåã§newã¨deleteãè¨è¿°ããäºãé¿ãã¦ãå®å ¨ãªã¹ãã¼ããã¤ã³ã¿ãå³ã¡ãªãã¸ã§ã¯ãã®å¯¿å½ã«ããèªåçã«ã¡ã¢ãªè§£æ¾ãè¡ã便å©ãªãã¤ã³ã¿ãå©ç¨ããã¹ãã§ãã
Â
ããããã¹ãã¼ããã¤ã³ã¿ã¨è¨ã£ã¦ã種é¡ãå¹¾ã¤ããããè½ã¨ãç©´ãåå¨ããã®ã§ã©ããã£ãç¶æ³ã§ã©ããå©ç¨ããã®ãè¯ãã®ããèå¯ãã¦ã¿ã¾ãã
Â
Dynamic memory managementãè¦ã¦ã¿ã¦ã C++11ããéåå¢ãã¦ãã¾ãã
http://en.cppreference.com/w/cpp/memory
Â
Â
std::auto_ptr
Â
ã¾ãã¯auto_ptrã§ãããã®ã¹ãã¼ããã¤ã³ã¿ã¯ããªã¯ã³ã³ãªã®ã§ä½¿ã£ã¦ã¯ããã¾ããã(deprecated)
ããã«ãauto_ptrãé§ä½¿ãããã¯ããã¯ãããã¨ãã¦ããããã使ãã¹ãã§ã¯ããã¾ããã
ãã®ã¹ãã¼ããã¤ã³ã¿ã¯å¹¾ã¤ãã®æ¬ ç¹ãæ±ãã¦ããä¸ã鿍奍è¦ç´ ã¯è¦æ ¼ãããããåé¤ããã¦ããããããªãããã§ãã
Â
説æã®çºã«ã¨ãããã¾ããããã®ã¹ãã¼ããã¤ã³ã¿ã«ã¯å ã«è¿°ã¹ãéãå¹¾ã¤ãã®åé¡ãããã¾ãã
ä½å¹´ãåã«æ¸ãããã³ã¼ãã§è¦ãããäºãããããããã¾ããã
Â
std::auto_ptr<hoge> ptr(new hoge);Â
Â
auto_ptrã¯ã¹ã³ã¼ããå¤ããã¨ç®¡çãã¦ãããã¤ã³ã¿ãèªåçã«deleteãã¾ãã
ããã«ãããããã°ã©ãã¯deleteãæ¸ãå¿ãã¡ã¢ãªããªã¼ã¯ããäºãæªç¶ã«é²ãäºãåºæ¥ã¾ãã
Â
auto_ptrã«ã¯æææ¨©ãåå¨ãã¾ããããã¦ãåããã¤ã³ã¿ã«å¯¾ãã¦æææ¨©ãæã¤auto_ptrã¯ãã£ã1ã¤ã§ãªããã°ãªãã¾ãããauto_ptråã®å¤æ°ãã³ãã¼ããã¨ãã®auto_ptrã管çãã¦ãããã¤ã³ã¿ãã³ãã¼å ã«ç§»åããã³ãã¼å ã®auto_ptrã¯nullptrãæãããã«ãªãã¾ããå³ã¡ã³ãã¼ã«ãã£ã¦åä¸ã®ãªãã¸ã§ã¯ããæãauto_ptrãå¢ããäºã¯ãªããå¿ ã1ã¤ã®auto_ptrã®ã¿ã«ä¿ããã¾ãããã®ãããªã³ãã¼ãç ´å£çãªã³ãã¼ã¨å¼ã³ããããauto_ptrã®æææ¨©ã®æ±ºã¾ããæç«ããã¦ãã¾ãã
Â
ããããã³ãã¼ä»¥å¤ã®æ¹æ³ã§æææ¨©ã®æ±ºã¾ããç¡è¦ãã¦åä¸ã®ãªãã¸ã§ã¯ããæãè¤æ°ã®auto_ptrã使ããäºãå¯è½ã§ããã®å ´ååããªãã¸ã§ã¯ãã®åé¤ãè¤æ°åè¡ããä¾å¤ãçºçããã¦ãã¾ãã¾ãã
ã¾ããç ´å£çãªã³ãã¼ã®åé¡ããæä½ã®ä¸ã§ã³ãã¼ãç¨ããå¯è½æ§ãããã³ã³ããã«æ ¼ç´ãã¦ã¯ãããªãã¨ãã£ããã¡ãªãããããã¾ãã
ä»ã«ãå餿ã®åä½ãæå®åºæ¥ãªããªã©ããã¡ãªããã®è©³ç´°ã«é¢ãã¦ã¯å°ãæ¤ç´¢ããã°æ²¢å±±åºã¦ãããã¨æãã¾ãã
Â
ãããã®ãã¡ãªãããå æããstd::unique_ptrã¹ãã¼ããã¤ã³ã¿ãæ¢ã«ããã®ã§ããã®ã¹ãã¼ããã¤ã³ã¿ã¯ç¨ããã¹ãã§ã¯ããã¾ããã
Â
Â
std::unique_ptr
Â
auto_ptrã®æ¬ ç¹ãè£ã£ãã¹ãã¼ããã¤ã³ã¿ã§ãã
ã³ã³ããã«å ¥ããäºãåºæ¥ãã«ã¹ã¿ã ããªã¼ã¿ã使ç¨ããäºãåºæ¥ã¾ãã
std::unique_ptr< new hoge(), custom_deleter > hoge_obj;
Â
auto_ptrã®ä»£ããã«ãã¡ãã使ãã¹ãã§ãã
Â
Â
std::shared_ptr
Â
std::shared_ptrã¯åæ§ã®Objectãæãshared_ptrãè¤æ°åå¨ããäºã許容ããã¹ãã¼ããã¤ã³ã¿ã§ããstd::shared_ptrã¯ç¾å¨å¹¾ã¤ã®shared_ptrãåããªãã¸ã§ã¯ããæãã¦ãããã®ã«ã¦ã³ã¿ãæã¡ã¾ãããããªãã¸ã§ã¯ããæãshared_ptrãå¢ããæã«ã«ã¦ã³ã¿ã1ã¤å ç®ããæ¸ã£ãæã«ã«ã¦ã³ã¿ã1ã¤æ¸ç®ãã¾ããæçµçã«ã©ããããåç §ãããªããªã£ããªãã¸ã§ã¯ãã«ã¢ã¯ã»ã¹ããæ¹æ³ãåå¨ããªãã®ã§ãã«ã¦ã³ã¿ã0ã«ãªã£ãéã«èªåçã«å¯¾è±¡ãªãã¸ã§ã¯ããdeleteãã¦ããã¾ããããã«ãã£ã¦ã¡ã¢ãªãªã¼ã¯ãé²ãäºãåºæ¥ã¾ãã
Â
é常ã«ä¾¿å©ã§ããã循ç°åç §ãã¦ãã¾ã£ãå ´åã«è§£æ¾ãããªãã¨ããç¹ã«æ°ãã¤ãã¦ä¸ããã
{
std::shared_ptr<loop> p1(new loop);
std::shared_ptr<loop> p2(new loop);
Â
p1->ptr = p2;
p2->ptr = p1;
} // ã¹ã³ã¼ããæãã¦ãã¡ã¢ãªã¯è§£æ¾ããããªã¼ã¯ãã
Â
ãã®åé¡ã®è§£æ±ºã«ã¯å¾ã»ã©è¨è¿°ããstd::weak_ptrãç¨ãã¾ãã
Â
ã¾ããstd::shared_ptr<loop> p1(new loop);ã¨ããæ¹æ³ã§ã¡ã¢ãªã確ä¿ãã¹ãã§ã¯ããã¾ããã
ããã«é¢ãã¦ãå¾ã»ã©è¨è¿°ããstd::make_sharedã§è§£èª¬ãã¾ãã
Â
Â
std::weak_ptr
Â
std::weak_ptrã¯ãæ¢ã«shared_ptrã«ãã管çããã¦ãããªãã¸ã§ã¯ãã¸ã®å¼±åç §ãä¿æãã¾ãã
ããã¯shared_ptrã¨éããåç §ã«ã¦ã³ãã«é¢ããç¡ãã¹ã³ã¼ããæããã¨ã¡ã¢ãªãè§£æ¾ãã¦ããã¾ãã
ããã«ãã£ã¦å¾ªç°åç §ã®åé¡ã解決ããäºãåºæ¥ã¾ãã
Â
ãã®åé¡ãåãä¸ãããã¡ãã®è¨äºãåãããããã§ããï¼ã¨ãããè¨ããããã¨ãæ¸ãã¦ããã¾ãï¼
http://d.hatena.ne.jp/naokirin/20110124/1295859711
Â
Â
std::make_shared
Â
å ã»ã©ãstd::shared_ptrã®é ã§ãstd::shared_ptr<loop> p1(new loop);ã¨ããæ¹æ³ã§ã¡ã¢ãªã確ä¿ãã¹ãã§ã¯ããã¾ããã¨æ¸ãã¾ããã
ãã®çç±ã«é¢ãã¦èª¬æãã¾ãã
Â
http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared
ã«èª¬æããã£ãã®ã§ç°¡åã«è¨³ãã¨
Â
template< class T, class... Args >
shared_ptr<T> make_shared( Args&&... args );
Â
ãã®é¢æ°ã¯ä¸è¬ã«Tåã®ãªãã¸ã§ã¯ãã¨ãã®shared_ptrã®çºã®ãããã¯ã®ç¢ºä¿ã1度ã®ã¡ã¢ãªå²ãå½ã¦æä½ã§è¡ãäºãæå¾ ããã¾ãã
ããã«å¯¾ãã¦ãstd::shared_ptr<T> p(new T(Args...))ã®è¨æ³ãç¨ãã宣è¨ã§ã¯å°ãªãã¨ã2度ã®ã¡ã¢ãªå²ãå½ã¦æä½ãè¡ãããä¸è¦ãªãªã¼ãã¼ããããæãã¨èãããã¾ãã
å ãã¦f(shared_ptr<int>(new int(42)), g())ã¨ããè¨è¿°ã¯ã¡ã¢ãªãªã¼ã¯ãèµ·ããå¯è½æ§ãããã¾ãããããmake_sharedãç¨ããã°èµ·ããã¾ããã
Â
ã¤ã¾ããstd::shared_ptrã«å¯¾ãã¦åçãªã¡ã¢ãªç¢ºä¿ãè¡ãå ´åã¯ãããã©ã¼ãã³ã¹é¢ãå®å ¨é¢ãããµã³ãã«ã³ã¼ãã«ããããã«
auto sp = std::make_shared<int>(10);Â
ã¨ãã£ã風ã«std::make_sharedãç¨ããã¹ããªã®ã§ãã
Â
Â
std::allocate_sharedÂ
Â
http://en.cppreference.com/w/cpp/memory/shared_ptr/allocate_shared
Â
template< class T, class Alloc, class... Args >
shared_ptr<T> allocate_shared( const Alloc& alloc, Args... args );
Â
const Alloc& allocã§æ¸¡ããã¢ãã±ã¼ã¿ã使ããmake_sharedã¨èãã¦è¯ãã¨æãã¾ãã
Â
èªåãã¾ã ã¾ã çè§£ãè¶³ãã¦ãªãããã«æãã®ã§ãC++ã®ãããæ¹ã ã¯ããã®è¨äºã«ééããè£è¶³ãªã©ããã°ã³ã¡ã³ãã§ææãã¦ãã ããã¨ãããããã§ãã