ãã¤ã³ã¿ã¯ç¨æ³ç¨éãå®ã£ã¦æ£ããã使ããã ãã
ãã®è¨äºã¯ C++ Advent Calendar jp 2010 ã®åå è¨äºã§ãã
C++ã«ã¯ãã¤ã³ã¿(åç
§ã®ã»ãã³ãã£ã¯ã¹ãæã¤ãã¼ã¿)ãããããããã¾ãããæ²ããããªçãã¤ã³ã¿(raw pointer/Cã®ãã¤ã³ã¿)ãç°¡å(è¦ãç®çãªæå³ã§)éãã¦ãã»ãã®ä¾¿å©ã§å®å
¨ã§é«éãªãã¤ã³ã¿ã¯ãªããªã使ã£ã¦ããããªãããã§ãã
ããã§ãæ¬ç¨¿ã§ã¯ãã»ãã»ããã¤ã³ã¿ãã®ç¨®é¡ã¨ä½¿ãåãã«ã¤ãã¦ç°¡åã«è§£èª¬ãã¾ãã
çãã¤ã³ã¿
æ¦è¦
ã¿ããªå¤§å¥½ã(ä¸é¨ã®äººã¯å¤§å«ã)ãªCã®ãã¤ã³ã¿ããªãã§ãã§ããä¸è½é¸æã§ããããªãã§ãã§ãããæ ã«å®è¡æã¨ã©ã¼ã®æ¸©åºã¨ãªããããå±éºãªåå¨ã§ããçãã¤ã³ã¿ãè¦ããããå®è¡æã¨ã©ã¼ãããã¨æã!
ç¹å¾´
- ã³ãã¼: å¯(Trivially Copyable)
- ã ã¼ã: å¯(ã³ãã¼ã¨åã)
- ææ権管ç: ãªã(ãªã¼ã¯ã»äºéããªã¼ããæ¾é¡)
è£è¶³
çãã¤ã³ã¿ãå±éºãªåå ã¯ããè¤æ°ã®æ¦å¿µãä¸ã¤ã®è¨èªæ©è½ã§è¡¨ç¾ãã¦ããããã¨ã«å°½ãã¾ããçãä¸ã¤ã§ãå¼±åç
§ããã¤ãã¬ã¼ã¿ããNullableãã¨ãã£ãæ©è½ãå®ç¾ãããã¨ãã§ãã¦ãã¾ãã¾ãããã®ä¸ææ権管çãåºæ¥ãªãã®ã§ãä¸æ³¨æãç¡ãã¦ããªã½ã¼ã¹ãªã¼ã¯ãäºéããªã¼ãã»ç¯å²å¤ã¢ã¯ã»ã¹ãèµ·ãã£ã¦ãã¾ãã¾ããã©ããã¦ãå¿
è¦ãªæ(C APIã¨ã®ã¤ã³ã¿ãã§ã¼ã¹ãä½ã¬ãã«ãªã©ã¤ãã©ãªã«ã¼ãã³)以å¤ã¯ä½¿ããªãããã«ãã¾ãããã
std::auto_ptr
æ¦è¦
C++98å¯ä¸ã®æ¨æºã¹ãã¼ããã¤ã³ã¿ããææ権ãèªåçã«ç§»è²ãããã¨ããåä½(ã ã¼ã)ããã¾ããã³ãã¼ã¯ä¸å¯è½ãªã®ã§ãçãã®ä»£ããã¨ãã¦ã¯ãã¾ãã¡ã§ãã主ãªä½¿ãéã¯ãã©ã¤ãã©ãªä¸ã®ããªã½ã¼ã¹ã確ä¿ãã¦ãã¤ã³ã¿ãè¿ãé¢æ°ãã®æ»ãå¤ã¨ãã¦T *ã®ä»£ããã«auto_ptr
ç¹å¾´
- ã³ãã¼: ä¸å¯
- ã ã¼ã: å¯(auto_ptr &ãåãã³ãã¼ã³ã³ã¹ãã©ã¯ã¿ãç¨æããã¦ãã)
- ææ権管ç: åä¸ã®å¼·åç §(æå¹ãªãã¤ã³ã¿ãä¿æãã¦ãããªãã¸ã§ã¯ããç ´æ£ãããæã«ãã¤ã³ã¿ã®åç §å ãdeleteãã)
è£è¶³
使ãåæã¯ãã¾ããããªãä¸ã«ãC++0xã§ã¯éæ¨å¥¨æ±ãã¨ãªã£ãããããããªåã§ãããããã§ããã¹ã¦ã®æ¨æºã©ã¤ãã©ãªã«å
¥ã£ã¦ããã®ã§ã移æ¤æ§ãéè¦ããã¨ãã«ã¯ãä¸è©±ã«ãªãã¨æãã¾ãã
boost::shared_ptr
æ¦è¦
ã¹ããã¨è¨ã£ããã³ã¬ãã¨ãããããã«ã¯å®çªã§ãããã©ããããåç §ãããªããªã£ãæç¹ã§ãã¹ãã©ã¯ã¿ãè¿ éã«å¼ã°ããããã¹ãã©ã¯ã¿ã®å¼ã³åºãå°ç¹ã§ãã¹ãã©ã¯ã¿ã®å®ç¾©ãè¦ãã¦ããªãã¦ãããããã¤ããªå¢çãå®å ¨ã«è¶ ãããã*1ãã¨ãã£ãç¹å¾´ããããåºæ¬çã«ä½¿ããªãã¨ããé¸æè¢ã¯ç¡ãã¨æãã¾ããå°ãé åã使ãå ´åã¯boost::shared_arrayãã©ããã
ç¹å¾´
- ã³ãã¼: å¯(åç §ã«ã¦ã³ãã«ããææå ã®æ°ãã«ã¦ã³ã)
- ã ã¼ã: å¯(ã³ãã¼ã¨åã)
- ææ権管ç: è¤æ°ã®å¼·åç §(åç §ã«ã¦ã³ã¿ãã¼ãã«ãªã£ãæç¹ã§ãç»é²ããã¦ããããªã¼ã¿ãå¼ã³åºã)
è£è¶³
ãã¾ã«ã循ç°åç
§ãããã¨ãè¨ã£ã¦æå¥ã¤ãã人ãå±
ã¾ãããå·éã«èãã¦ã¿ã¦ãã ããã循ç°åç
§ãçºçãããæç¹ã§ãã¹ãã©ã¯ã¿ã®å®å
¨ãªå®è¡ãåºæ¥ã¾ãã(çæ¹ãå
ã«ç ´æ£ããã¨ãããçæ¹ã®ãªãã¸ã§ã¯ãã¯ãã³ã°ãªã³ã°ãã¤ã³ã¿ãæã¤ãã¨ã«ãªã*2 )ããã¹ãã©ã¯ã¿ãåæã¨ããC++ã§ã¯ããããç¹å¥ãªä»çµã¿ã使ããªãã¨å¾ªç°åç
§ã®è§£æ±ºã¯åºæ¥ãªã*3ã®ã§ãã
boost::scoped_ptr
æ¦è¦
ãã¼ã«ã«ã¹ã³ã¼ãå ã§ã®ã¿æå¹ãªãã¤ã³ã¿ã§ããã³ãã¼ä¸å¯ãã ã¼ããç¡ãã®ã§ä»ã®ã¹ã³ã¼ãã«æ¸¡ããã¨ã¯ã§ãã¾ãããããéã«çãã¤ã³ã¿ã¨æ¯è¼ãã¦ãªã¼ãã¼ãããã¯ããã¾ããã主ãªä½¿ãéã¯ã¯ã©ã¹ã®ã¡ã³ãå¤æ°ã§ãããã(ãã³ãã©ãªãããã¡ã¯std::vectorã使ãã¾ããã)ãunique_ptr(å¾è¿°)ã®ç»å ´ã«ããéåã¨å½±ãèããªãã¾ãããé åã®å ´åã¯shared_ã¨åããboost::scoped_arrayã使ãã¾ãããã
ç¹å¾´
- ã³ãã¼: ä¸å¯
- ã ã¼ã: ä¸å¯
- ææ権管ç: åä¸ã®å¼·åç §(ç ´æ£æã«deleteãå¼ã¶)
è£è¶³
ç»é¢å ã«newãdeleteãè¦ãã¦ãããçãã§ãããï¼ã¨ããå ´é¢ã§ããscoped_ptrã«ãã¦ããã¨ä¾å¤å®å ¨ãå¥ã«èæ ®ããå¿ è¦ãç¡ããªãã¾ãããä¾å¤ã¯ å¿ããããã« é£ãã§ããã
std::shared_ptr
æ¦è¦
C++0xã§ç»å ´ããã¹ãã¼ããã¤ã³ã¿ãboost::shared_ptrã®ã»ã¼ã¹ã移æ¤ããã ãBoostçã¨éããdefault_deleteãTã«å¯¾ãã¦ç¹æ®åããã¦ããã®ã§ãé
åã®å ´åã¯std::shared_ptrTã§ä½¿ããã®ã¯unique_ptrã ãã§ãããé
åã«å¯¾ãã¦ã¯shared_ptr(new T[n], default_delete
ç¹å¾´
- ã³ãã¼: å¯(åç §ã«ã¦ã³ãã«ããææå ã®æ°ãã«ã¦ã³ã)
- ã ã¼ã: å¯
- ææ権管ç: è¤æ°ã®å¼·åç §(åç §ã«ã¦ã³ã¿ãã¼ãã«ãªã£ãæç¹ã§ãç»é²ããã¦ããããªã¼ã¿ãå¼ã³åºã)
è£è¶³
æ§ç¯æã®ã³ã¹ããæ¸ããããã«make_sharedã使ãã¨ããããã辺ã®è©±ã¯id:gintenlaboå
çããããä½ãæ¸ãã¦ãããããªã
std::unique_ptr
æ¦è¦
C++0xã§ç»å ´ããã¹ãã¼ããã¤ã³ã¿ãboost::scoped_ptrã®è¶ å¼·åçã§ããã ã¼ãããµãã¼ããããã®ã§ããã¼ã«ã«ã¹ã³ã¼ãã«éããããè¤æ°ã®ãªãã¸ã§ã¯ãã«åæã«ææãããªãããæºãããã¹ã¦ã®ç¶æ³ã§ä½¿ç¨å¯è½ã§ããå½ç¶ã¼ããªã¼ãã¼ããã(çãæ¯)ãã¾ããã«ã¹ã¿ã ããªã¼ã¿(operator deleteã®ä»£ããã«ãã¹ãã©ã¯ãæã«å¼ã°ããé¢æ°)ã使ããã®ã§ãã¡ã¢ãªä»¥å¤ã®ãªã½ã¼ã¹(ãã¡ã¤ã«ã»ã½ã±ããç)ã«ã使ãã¾ãã
ç¹å¾´
- ã³ãã¼: ä¸å¯
- ã ã¼ã: å¯
- ææ権管ç: åä¸ã®å¼·åç §(ç ´æ£æã«deleteãå¼ã¶)
è£è¶³
å人çã«ã¯std::shared_ptrããã使ç¨é »åº¦ãå¤ããªãæ°ããã¾ããããªã¼ã¿ãããã®ã§ãC APIã§ç¢ºä¿ãããªã½ã¼ã¹ã®ç®¡çã«ã使ãã¾ã(è¦æ¹ã«ãã£ã¦ã¯ããã¤ã³ã©ã¤ã³ã§ãªã½ã¼ã¹ç®¡çã¯ã©ã¹ãè¨è¿°ã§ããã¯ã©ã¹ãã³ãã¬ã¼ããã¨èãããã¨ãã§ãã)ãã¾ããunique_ptr
ã¾ã¨ã
C++ã¯ãã¤ã³ã¿ããããããã£ã¦å¹¸ãã§ãã!ã©ã使ããè¿·ã£ã人ã¯ã¨ããããunique_ptrãã³ãã¼ããããªã£ããshared_ptrã使ãããã«ããã°ããã§ããããunique_ptrã¯äººéãdeleteãtry-catchãæåã§æ¸ãã®ã¨åãã³ã¼ã(以ä¸ã§ã以ä¸ã§ããªã)ãèªåã§çæãã¦ãããã®ã§ã追å ã³ã¹ããæ°ã«ãããã¨ãªãå®å
¨æ§ã»å©ä¾¿æ§ãæã«å
¥ãããã¾ããã¾ãshared_ptrã¯åç
§ã«ã¦ã³ãã¨åæ¶å»ãè¡ãã®ã§(ç¹ã«ã¹ã¬ããéã§å
±æããã¦ããå ´åã¯)ã³ãã¼ã«ããããªè¿½å ã³ã¹ãããããã¾ããããããè£ã£ã¦ä½ãããæ©è½ãæã£ã¦ããã®ã§ã大ãã«æ´»ç¨ãã¾ããã!
ãªãã ãé©å½ã«æ¸ããæ溢ããè¨äºã§ããããã¯ãã£ã¨æ°ã®ããã§ããid:coiledcoilå
çã«ç¶ãã¾ãã
*1:id:Cryoliteå çã®伝説のセッションåç §
*2:ä»ã®è¨èªã§ã¯ããã¡ã¤ãã©ã¤ã¶ã§ã®ææãªãã¸ã§ã¯ãã«å¯¾ãã¦ã®ã¢ã¯ã»ã¹ãç¦æ¢ãããçã§åé¿ãã¦ããããã§ã
*3:weak_ptrã«ãã循ç°åç §ã®è§£æ±ºã«ã¤ãã¦ã¯è©³ãã人ã«ä»»ãã¾ã