åç §ã«ãŠã³ãã¢ã«ãŽãªãºã ã®æ·±æãã埪ç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å®è£ æŠç¥ãå©ç¹ãå¶éãããã³åç°åç §åé¡ã®å ææ¹æ³ã解説ã
åç §ã«ãŠã³ãã¢ã«ãŽãªãºã ïŒåŸªç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å®è£
åç §ã«ãŠã³ãã¯ãã¡ã¢ãªå ã®åãªããžã§ã¯ãããããæãåç §ã®æ°ãç¶æããã¡ã¢ãªç®¡çææ³ã§ãããªããžã§ã¯ãã®åç §ã«ãŠã³ãããŒãã«ãªããšãä»ã®ãªããžã§ã¯ãããããåç §ããŠããªãããšãæå³ãããªããžã§ã¯ãã¯å®å šã«è§£æŸã§ããŸãããã®ã¢ãããŒãã¯ããã€ãã®å©ç¹ããããããŸãããç¹ã«åŸªç°ããŒã¿æ§é ã§ã¯èª²é¡ã«çŽé¢ããŸãããã®èšäºã§ã¯ãåç §ã«ãŠã³ãããã®å©ç¹ãå¶éãããã³åŸªç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå®è£ ããããã®æŠç¥ã«ã€ããŠå æ¬çãªæŠèŠãæäŸããŸãã
åç §ã«ãŠã³ããšã¯ïŒ
åç §ã«ãŠã³ãã¯èªåã¡ã¢ãªç®¡çã®äžçš®ã§ããæªäœ¿çšã®ãªããžã§ã¯ãã宿çã«ã¹ãã£ã³ããã¬ããŒãžã³ã¬ã¯ã¿ã«äŸåããã®ã§ã¯ãªããåç §ã«ãŠã³ãã¯å°éäžèœã«ãªã£ãã¡ã¢ãªãããã«åå©çšããããšãç®æããŸããã¡ã¢ãªå ã®åãªããžã§ã¯ãã«ã¯ããã®ãªããžã§ã¯ããžã®åç §ïŒãã€ã³ã¿ããªã³ã¯ãªã©ïŒã®æ°ã衚ãåç §ã«ãŠã³ããé¢é£ä»ããããŠããŸããåºæ¬çãªæäœã¯æ¬¡ã®ãšããã§ãã
- åç §ã«ãŠã³ãã®ã€ã³ã¯ãªã¡ã³ãïŒ ãªããžã§ã¯ããžã®æ°ããåç §ãäœæããããšããªããžã§ã¯ãã®åç §ã«ãŠã³ããã€ã³ã¯ãªã¡ã³ããããŸãã
- åç §ã«ãŠã³ãã®ãã¯ãªã¡ã³ãïŒ ãªããžã§ã¯ããžã®åç §ãåé€ãããããã¹ã³ãŒãå€ã«ãªã£ãããããšããªããžã§ã¯ãã®åç §ã«ãŠã³ãããã¯ãªã¡ã³ããããŸãã
- è§£æŸïŒ ãªããžã§ã¯ãã®åç §ã«ãŠã³ãããŒãã«éãããšããã®ãªããžã§ã¯ãã¯ããã°ã©ã ã®ä»ã®éšåããåç §ãããªããªã£ãããšãæå³ããŸãããã®æç¹ã§ããªããžã§ã¯ãã¯è§£æŸããããã®ã¡ã¢ãªã¯åå©çšã§ããŸãã
äŸïŒ Pythonã®ç°¡åãªã·ããªãªãèããŠã¿ãŸãããïŒPythonã¯äž»ã«ãã¬ãŒã¹ã¬ããŒãžã³ã¬ã¯ã¿ã䜿çšããŠããŸããã峿ã¯ãªãŒã³ã¢ããã®ããã«åç §ã«ãŠã³ããæ¡çšããŠããŸãïŒïŒ
obj1 = MyObject()
obj2 = obj1 # obj1ã®åç
§ã«ãŠã³ããã€ã³ã¯ãªã¡ã³ã
del obj1 # MyObjectã®åç
§ã«ãŠã³ãããã¯ãªã¡ã³ãïŒobj2ãä»ããŠãªããžã§ã¯ãã«ã¯ãŸã ã¢ã¯ã»ã¹å¯èœ
del obj2 # MyObjectã®åç
§ã«ãŠã³ãããã¯ãªã¡ã³ãïŒãããæåŸã®åç
§ã ã£ãå Žåããªããžã§ã¯ãã¯è§£æŸããã
åç §ã«ãŠã³ãã®å©ç¹
åç §ã«ãŠã³ãã¯ããã¬ãŒã¹ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãªã©ã®ä»ã®ã¡ã¢ãªç®¡çææ³ãšæ¯èŒããŠãããã€ãã®èª¬åŸåã®ããå©ç¹ãæäŸããŸãã
- å³æè§£æŸïŒ ãªããžã§ã¯ããå°éäžèœã«ãªããšããã«ã¡ã¢ãªãè§£æŸãããã¡ã¢ãªãããããªã³ããåæžãããåŸæ¥ã®ã¬ããŒãžã³ã¬ã¯ã¿ã«äŒŽãé·ãäžæåæ¢ãåé¿ã§ããŸãããã®æ±ºå®çåäœã¯ããªã¢ã«ã¿ã€ã ã·ã¹ãã ãå³å¯ãªããã©ãŒãã³ã¹èŠä»¶ãæã€ã¢ããªã±ãŒã·ã§ã³ã«ç¹ã«åœ¹ç«ã¡ãŸãã
- ã·ã³ãã«ãïŒ åºæ¬çãªåç §ã«ãŠã³ãã¢ã«ãŽãªãºã ã¯å®è£ ãæ¯èŒçç°¡åã§ãããçµã¿èŸŒã¿ã·ã¹ãã ããªãœãŒã¹ãéãããç°å¢ã«é©ããŠããŸãã
- åç §ã®å±ææ§ïŒ ãªããžã§ã¯ããè§£æŸãããšããããåç §ããä»ã®ãªããžã§ã¯ããè§£æŸãããããšãããããããã£ãã·ã¥ããã©ãŒãã³ã¹ãåäžããã¡ã¢ãªãã©ã°ã¡ã³ããŒã·ã§ã³ãåæžãããŸãã
åç §ã«ãŠã³ãã®å¶é
åç §ã«ãŠã³ãã¯ãã®å©ç¹ã«ãããããããç¹å®ã®ã·ããªãªã§ã®å®çšæ§ã«åœ±é¿ãäžããå¯èœæ§ã®ããããã€ãã®å¶éã«èŠããã§ããŸãã
- ãªãŒããŒãããïŒ åç §ã«ãŠã³ãã®ã€ã³ã¯ãªã¡ã³ããšãã¯ãªã¡ã³ãã¯ãç¹ã«ãªããžã§ã¯ãã®äœæãšåé€ãé »ç¹ã«è¡ãããã·ã¹ãã ã§ã¯ãããªãã®ãªãŒããŒããããå°å ¥ããå¯èœæ§ããããŸãããã®ãªãŒããŒãããã¯ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- åç°åç §ïŒ åºæ¬çãªåç §ã«ãŠã³ãã®æãéèŠãªå¶éã¯ãåç°åç §ãåŠçã§ããªãããšã§ãã2ã€ä»¥äžã®ãªããžã§ã¯ãããäºããåç §ããŠããå Žåãããããããã°ã©ã ã®æ®ãã®éšåããå°éäžèœã«ãªã£ããšããŠãããããã®åç §ã«ãŠã³ãã¯ãŒãã«ãªãããšã¯ãªããã¡ã¢ãªãªãŒã¯ã«ã€ãªãããŸãã
- è€éãïŒ ç¹ã«ãã«ãã¹ã¬ããç°å¢ã§åç §ã«ãŠã³ããæ£ããå®è£ ããã«ã¯ãç«¶åç¶æ ãåé¿ããæ£ç¢ºãªåç §ã«ãŠã³ããä¿èšŒããããã®æ³šææ·±ãåæãå¿ èŠã§ããããã«ãããå®è£ ãè€éã«ãªãå¯èœæ§ããããŸãã
åç°åç §åé¡
åç°åç §åé¡ã¯ãåçŽãªåç §ã«ãŠã³ãã®èŽåœçãªåŒ±ç¹ã§ãããªããžã§ã¯ãAãšBãèããŸããAãBãåç §ããBãAãåç §ããŠããŸããä»ã®ãªããžã§ã¯ããAãŸãã¯Bãåç §ããŠããªãå Žåã§ãããããã®åç §ã«ãŠã³ãã¯å°ãªããšã1ã«ãªããè§£æŸãããŸãããããã¯ã¡ã¢ãªãªãŒã¯ãåŒãèµ·ãããŸãããªããªããAãšBãå æããã¡ã¢ãªã¯å²ãåœãŠããããŸãŸã§ãããå°éäžèœã ããã§ãã
äŸïŒ Pythonã§ã¯ïŒ
class Node:
def __init__(self, data):
self.data = data
self.next = None
node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1 # åç°åç
§ãäœæããã
del node1
del node2 # ã¡ã¢ãªãªãŒã¯ïŒããŒãã¯ãã¯ãå°éäžèœã§ãããåç
§ã«ãŠã³ãã¯ãŸã 1ã§ã
ã¹ããŒããã€ã³ã¿ïŒäŸïŒ`std::shared_ptr`ïŒã䜿çšããC++ã®ãããªèšèªã§ããæ³šææ·±ã管çããªããšãã®åäœã瀺ãå¯èœæ§ããããŸãã`shared_ptr`ã®ãµã€ã¯ã«ã¯è§£æŸã劚ããŸãã
埪ç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³æŠç¥
åç°åç §åé¡ã«å¯ŸåŠããããã«ãåç §ã«ãŠã³ããšçµã¿åãããŠããã€ãã®åŸªç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ææ³ãæ¡çšã§ããŸãããããã®ææ³ã¯ãå°éäžèœãªãªããžã§ã¯ãã®ãµã€ã¯ã«ãç¹å®ããŠç Žå£ããããããè§£æŸã§ããããã«ããããšãç®æããŠããŸãã
1. ããŒã¯ã¢ã³ãã¹ã€ãŒãã¢ã«ãŽãªãºã
ããŒã¯ã¢ã³ãã¹ã€ãŒãã¢ã«ãŽãªãºã ã¯ãåç §ã«ãŠã³ãã·ã¹ãã ã§ã®åç°åç §ã®åŠçã«é©å¿ã§ãããåºã䜿çšãããŠããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ææ³ã§ããããã¯2ã€ã®ãã§ãŒãºãå«ã¿ãŸãã
- ããŒã¯ãã§ãŒãºïŒ ããã°ã©ã ããçŽæ¥ã¢ã¯ã»ã¹å¯èœãªãªããžã§ã¯ãã®ã»ããã§ããã«ãŒããªããžã§ã¯ãããéå§ããŠãã¢ã«ãŽãªãºã ã¯ãªããžã§ã¯ãã°ã©ãããã©ããå°éå¯èœãªãã¹ãŠã®ãªããžã§ã¯ãã«ããŒã¯ãä»ããŸãã
- ã¹ã€ãŒããã§ãŒãºïŒ ããŒãã³ã°ãã§ãŒãºã®åŸãã¢ã«ãŽãªãºã ã¯ã¡ã¢ãªå šäœãã¹ãã£ã³ããããŒã¯ãããŠããªããªããžã§ã¯ããç¹å®ããŸãããããã®ããŒã¯ãããŠããªããªããžã§ã¯ãã¯å°éäžèœãšèŠãªãããè§£æŸãããŸãã
åç §ã«ãŠã³ãã®ã³ã³ããã¹ãã§ã¯ãããŒã¯ã¢ã³ãã¹ã€ãŒãã¢ã«ãŽãªãºã ã䜿çšããŠãå°éäžèœãªãªããžã§ã¯ãã®ãµã€ã¯ã«ãç¹å®ã§ããŸããã¢ã«ãŽãªãºã ã¯äžæçã«ãã¹ãŠã®ãªããžã§ã¯ãã®åç §ã«ãŠã³ãããŒãã«èšå®ãããã®åŸããŒãã³ã°ãã§ãŒãºãå®è¡ããŸããããŒãã³ã°ãã§ãŒãºåŸã«ãªããžã§ã¯ãã®åç §ã«ãŠã³ãããŒãã®ãŸãŸã§ããå Žåããã®ãªããžã§ã¯ãã¯ã©ã®ã«ãŒããªããžã§ã¯ããããå°éäžèœã§ãããå°éäžèœãªãµã€ã¯ã«ã®äžéšã§ããããšãæå³ããŸãã
å®è£ ã«é¢ããèæ ®äºé ïŒ
- ããŒã¯ã¢ã³ãã¹ã€ãŒãã¢ã«ãŽãªãºã ã¯ã宿çã«ããŸãã¯ã¡ã¢ãªäœ¿çšéããããå€ã«éãããšãã«ããªã¬ãŒã§ããŸãã
- ç¡éã«ãŒããåé¿ããããã«ãããŒãã³ã°ãã§ãŒãºäžã«åç°åç §ãæ éã«åŠçããããšãéèŠã§ãã
- ã¢ã«ãŽãªãºã ã¯ãç¹ã«ã¹ã€ãŒããã§ãŒãºäžã«ãã¢ããªã±ãŒã·ã§ã³å®è¡ã«äžæåæ¢ãå°å ¥ããå¯èœæ§ããããŸãã
2. ãµã€ã¯ã«æ€åºã¢ã«ãŽãªãºã
ããã€ãã®ç¹æ®ãªã¢ã«ãŽãªãºã ã¯ããªããžã§ã¯ãã°ã©ãã®ãµã€ã¯ã«ãç¹å®ããããã«ç¹å¥ã«èšèšãããŠããŸãããããã®ã¢ã«ãŽãªãºã ã¯ãåç §ã«ãŠã³ãã·ã¹ãã ã§å°éäžèœãªãªããžã§ã¯ãã®ãµã€ã¯ã«ãç¹å®ããããã«äœ¿çšã§ããŸãã
a) Tarjanã®åŒ·é£çµæåã¢ã«ãŽãªãºã
Tarjanã®ã¢ã«ãŽãªãºã ã¯ãæåã°ã©ãã®åŒ·é£çµæåïŒSCCïŒãç¹å®ããã°ã©ãèµ°æ»ã¢ã«ãŽãªãºã ã§ããSCCã¯ããã¹ãŠã®é ç¹ãä»ã®ãã¹ãŠã®é ç¹ããå°éå¯èœãªéšåã°ã©ãã§ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ã³ã³ããã¹ãã§ã¯ãSCCã¯ãªããžã§ã¯ãã®ãµã€ã¯ã«ã衚ãããšãã§ããŸãã
åäœæ¹æ³ïŒ
- ã¢ã«ãŽãªãºã ã¯ããªããžã§ã¯ãã°ã©ãã®æ·±ãåªå æ€çŽ¢ïŒDFSïŒãå®è¡ããŸãã
- DFSäžãåãªããžã§ã¯ãã«ã¯äžæã®ã€ã³ããã¯ã¹ãšlowlinkå€ãå²ãåœãŠãããŸãã
- lowlinkå€ã¯ãçŸåšã®ãªããžã§ã¯ãããå°éå¯èœãªä»»æã®ãªããžã§ã¯ãã®æå°ã€ã³ããã¯ã¹ã衚ããŸãã
- DFSãã¹ã¿ãã¯äžã«ãããªããžã§ã¯ãã«ééãããšãçŸåšã®ãªããžã§ã¯ãã®lowlinkå€ãæŽæ°ãããŸãã
- DFSãSCCã®åŠçãå®äºãããšãã¹ã¿ãã¯ããSCCå ã®ãã¹ãŠã®ãªããžã§ã¯ããããããããµã€ã¯ã«ã®äžéšãšããŠç¹å®ããŸãã
b) ãã¹ããŒã¹åŒ·é£çµæåã¢ã«ãŽãªãºã
ãã¹ããŒã¹åŒ·é£çµæåã¢ã«ãŽãªãºã ïŒPBSCAïŒã¯ãæåã°ã©ãã®SCCãç¹å®ããããã®ãã1ã€ã®ã¢ã«ãŽãªãºã ã§ããç¹ã«çãªã°ã©ãã®å Žåãå®éã«ã¯Tarjanã®ã¢ã«ãŽãªãºã ãããå¹ççã§ãã
åäœæ¹æ³ïŒ
- ã¢ã«ãŽãªãºã ã¯ãDFSäžã«èšªåããããªããžã§ã¯ãã®ã¹ã¿ãã¯ãç¶æããŸãã
- åãªããžã§ã¯ãã«ã€ããŠãã«ãŒããªããžã§ã¯ãããçŸåšã®ãªããžã§ã¯ããŸã§ã®ãã¹ãæ ŒçŽããŸãã
- ã¢ã«ãŽãªãºã ãã¹ã¿ãã¯äžã«ãããªããžã§ã¯ãã«ééãããšãçŸåšã®ãªããžã§ã¯ããžã®ãã¹ãšã¹ã¿ãã¯äžã®ãªããžã§ã¯ããžã®ãã¹ãæ¯èŒããŸãã
- çŸåšã®ãªããžã§ã¯ããžã®ãã¹ãã¹ã¿ãã¯äžã®ãªããžã§ã¯ããžã®ãã¹ã®ãã¬ãã£ãã¯ã¹ã§ããå ŽåãçŸåšã®ãªããžã§ã¯ãããµã€ã¯ã«ã®äžéšã§ããããšãæå³ããŸãã
3. é å»¶åç §ã«ãŠã³ã
é å»¶åç §ã«ãŠã³ãã¯ãåç §ã«ãŠã³ãã®ã€ã³ã¯ãªã¡ã³ããšãã¯ãªã¡ã³ãã®æäœãåŸã§å®è¡ããããšã§ããã®ãªãŒããŒããããåæžããããšãç®æããŠããŸããããã¯ãåç §ã«ãŠã³ãã®å€æŽããããã¡ãªã³ã°ãããããã§é©çšããããšã«ãã£ãŠéæã§ããŸãã
æè¡ïŒ
- ã¹ã¬ããããŒã«ã«ãããã¡ïŒ åã¹ã¬ããã¯ãåç §ã«ãŠã³ãã®å€æŽãæ ŒçŽããããã®ããŒã«ã«ãããã¡ãç¶æããŸãããããã®å€æŽã¯ã宿çã«ããŸãã¯ãããã¡ããã£ã±ãã«ãªã£ããšãã«ãã°ããŒãã«åç §ã«ãŠã³ãã«é©çšãããŸãã
- ã©ã€ãããªã¢ïŒ ã©ã€ãããªã¢ã¯ããªããžã§ã¯ããã£ãŒã«ããžã®æžã蟌ã¿ãã€ã³ã¿ãŒã»ããããããã«äœ¿çšãããŸããæžãèŸŒã¿æäœãæ°ããåç §ãäœæãããšãã©ã€ãããªã¢ã¯æžã蟌ã¿ãã€ã³ã¿ãŒã»ããããåç §ã«ãŠã³ãã®ã€ã³ã¯ãªã¡ã³ããé å»¶ãããŸãã
é å»¶åç §ã«ãŠã³ãã¯ãªãŒããŒããããåæžã§ããŸãããã¡ã¢ãªã®è§£æŸãé ãããå¯èœæ§ããããã¡ã¢ãªäœ¿çšéãå¢å ããå¯èœæ§ããããŸãã
4. éšåããŒã¯ã¢ã³ãã¹ã€ãŒã
ã¡ã¢ãªå šäœã«å¯ŸããŠå®å šãªããŒã¯ã¢ã³ãã¹ã€ãŒããå®è¡ããã®ã§ã¯ãªããç¹å®ã®ãªããžã§ã¯ããŸãã¯ãªããžã§ã¯ãã®ã°ã«ãŒãããå°éå¯èœãªãªããžã§ã¯ããªã©ãããå°ããªã¡ã¢ãªé åã«å¯ŸããŠéšåçãªããŒã¯ã¢ã³ãã¹ã€ãŒããå®è¡ã§ããŸããããã«ãããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã«äŒŽãäžæåæ¢æéãççž®ã§ããŸãã
å®è£ ïŒ
- ã¢ã«ãŽãªãºã ã¯ããµã€ã¯ã«ã®äžéšã§ããå¯èœæ§ãé«ããªããžã§ã¯ãã§ããçããããªããžã§ã¯ãã®ã»ããããéå§ããŸãã
- ãããã®ãªããžã§ã¯ãããå°éå¯èœãªãªããžã§ã¯ãã°ã©ãããã©ããå°éå¯èœãªãã¹ãŠã®ãªããžã§ã¯ãã«ããŒã¯ãä»ããŸãã
- ãã®åŸãããŒã¯ãããé åãã¹ã€ãŒãããããŒã¯ãããŠããªããªããžã§ã¯ããè§£æŸããŸãã
ããŸããŸãªèšèªã§ã®åŸªç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å®è£
埪ç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å®è£ ã¯ãããã°ã©ãã³ã°èšèªãšåºç€ãšãªãã¡ã¢ãªç®¡çã·ã¹ãã ã«ãã£ãŠç°ãªãå ŽåããããŸãã以äžã«ããã€ãã®äŸã瀺ããŸãã
Python
Pythonã¯ãåç §ã«ãŠã³ããšãã¬ãŒã¹ã¬ããŒãžã³ã¬ã¯ã¿ãçµã¿åãããŠã¡ã¢ãªã管çããŸããåç §ã«ãŠã³ãã³ã³ããŒãã³ãã¯ãªããžã§ã¯ãã®å³æè§£æŸãåŠçãããã¬ãŒã¹ã¬ããŒãžã³ã¬ã¯ã¿ã¯å°éäžèœãªãªããžã§ã¯ãã®ãµã€ã¯ã«ãæ€åºããŠç Žå£ããŸãã
Pythonã®ã¬ããŒãžã³ã¬ã¯ã¿ã¯`gc`ã¢ãžã¥ãŒã«ã«å®è£ ãããŠããŸãã`gc.collect()`颿°ã䜿çšããŠãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæåã§ããªã¬ãŒã§ããŸããã¬ããŒãžã³ã¬ã¯ã¿ã¯å®æçã«èªåçã«ãå®è¡ãããŸãã
äŸïŒ
import gc
class Node:
def __init__(self, data):
self.data = data
self.next = None
node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1 # åç°åç
§ãäœæããã
del node1
del node2
gc.collect() # ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã匷å¶ããŠãµã€ã¯ã«ãç Žå£
C++
C++ã«ã¯çµã¿èŸŒã¿ã®ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¯ãããŸãããã¡ã¢ãªç®¡çã¯éåžžã`new`ããã³`delete`ã䜿çšããŠæåã§ããŸãã¯ã¹ããŒããã€ã³ã¿ã䜿çšããŠåŠçãããŸãã
C++ã§åŸªç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå®è£ ããã«ã¯ããµã€ã¯ã«æ€åºãåããã¹ããŒããã€ã³ã¿ã䜿çšã§ããŸãã1ã€ã®ã¢ãããŒãã¯ã`std::weak_ptr`ã䜿çšããŠãµã€ã¯ã«ãå£ãããšã§ãã`weak_ptr`ã¯ããããæããªããžã§ã¯ãã®åç §ã«ãŠã³ããã€ã³ã¯ãªã¡ã³ãããªãã¹ããŒããã€ã³ã¿ã§ããããã«ããããµã€ã¯ã«ã®äžéšã§ãã£ãŠããªããžã§ã¯ãã®è§£æŸã劚ããããšãªããªããžã§ã¯ãã®ãµã€ã¯ã«ãäœæã§ããŸãã
äŸïŒ
#include
#include
class Node {
public:
int data;
std::shared_ptr next;
std::weak_ptr prev; // ãµã€ã¯ã«ãå£ãããã«weak_ptrã䜿çš
Node(int data) : data(data) {}
~Node() { std::cout << "Node destroyed with data: " << data << std::endl; }
};
int main() {
std::shared_ptr node1 = std::make_shared(1);
std::shared_ptr node2 = std::make_shared(2);
node1->next = node2;
node2->prev = node1; // ãµã€ã¯ã«ãäœæãããããprevã¯weak_ptr
node2.reset();
node1.reset(); // ããŒãã¯ç Žæ£ããã
return 0;
}
ãã®äŸã§ã¯ã`node2`ã¯`node1`ãžã®`weak_ptr`ãä¿æããŠããŸãã`node1`ãš`node2`ã®äž¡æ¹ãã¹ã³ãŒãå€ã«ãªããšããããã®å ±æãã€ã³ã¿ã¯ç Žæ£ããã匱ãã€ã³ã¿ã¯åç §ã«ãŠã³ãã«å¯äžããªãããããªããžã§ã¯ãã¯è§£æŸãããŸãã
Java
Javaã¯ããã¬ãŒã¹ãšå éšã§ã®ããçš®ã®åç §ã«ãŠã³ãã®äž¡æ¹ãåŠçããèªåã¬ããŒãžã³ã¬ã¯ã¿ã䜿çšããŸããã¬ããŒãžã³ã¬ã¯ã¿ã¯ãåç°åç §ã«é¢äžãããªããžã§ã¯ããå«ããå°éäžèœãªãªããžã§ã¯ãã®æ€åºãšåå©çšãæ åœããŸããéåžžãJavaã§åŸªç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæç€ºçã«å®è£ ããå¿ èŠã¯ãããŸããã
ãã ããã¬ããŒãžã³ã¬ã¯ã¿ã®åäœãçè§£ããããšã¯ãããå¹ççãªã³ãŒããæžãã®ã«åœ¹ç«ã¡ãŸãããããã¡ã€ã©ã®ãããªããŒã«ã䜿çšããŠã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¢ã¯ãã£ããã£ãç£èŠããæœåšçãªã¡ã¢ãªãªãŒã¯ãç¹å®ã§ããŸãã
JavaScript
JavaScriptã¯ãã¡ã¢ãªã管çããããã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒå€ãã®å ŽåããŒã¯ã¢ã³ãã¹ã€ãŒãã¢ã«ãŽãªãºã ïŒã«äŸåããŠããŸããåç §ã«ãŠã³ãã¯ãšã³ãžã³ããªããžã§ã¯ãã远跡ããæ¹æ³ã®äžéšã§ãããéçºè ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãçŽæ¥å¶åŸ¡ããŸããããšã³ãžã³ã¯ãµã€ã¯ã«ã®æ€åºãæ åœããŸãã
ãã ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãµã€ã¯ã«ãé ãããå¯èœæ§ã®ããæå³ããªã倧ããªãªããžã§ã¯ãã°ã©ãã®äœæã«ã¯æ³šæããŠãã ãããäžèŠã«ãªã£ããªããžã§ã¯ããžã®åç §ãè§£é€ããããšã¯ããšã³ãžã³ãã¡ã¢ãªãããå¹ççã«åå©çšããã®ã«åœ¹ç«ã¡ãŸãã
åç §ã«ãŠã³ããšåŸªç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ãã¹ããã©ã¯ãã£ã¹
- åç°åç §ãæå°éã«æããïŒ åç°åç §ã®äœæãæå°éã«æããããã«ããŒã¿æ§é ãèšèšããŸãããµã€ã¯ã«ãå®å šã«åé¿ããããã«ã代æ¿ããŒã¿æ§é ãŸãã¯ææ³ãæ€èšããŠãã ããã
- 匱åç §ã䜿çšããïŒ åŒ±åç §ããµããŒãããèšèªã§ã¯ããããã䜿çšããŠãµã€ã¯ã«ãå£ããŸãã匱åç §ã¯ããããæããªããžã§ã¯ãã®åç §ã«ãŠã³ããã€ã³ã¯ãªã¡ã³ãããªãããããªããžã§ã¯ãããµã€ã¯ã«ã®äžéšã§ãã£ãŠãè§£æŸã§ããŸãã
- ãµã€ã¯ã«æ€åºãå®è£ ããïŒ çµã¿èŸŒã¿ãµã€ã¯ã«æ€åºæ©èœã®ãªãèšèªã§åç §ã«ãŠã³ãã䜿çšããŠããå Žåã¯ããµã€ã¯ã«æ€åºã¢ã«ãŽãªãºã ãå®è£ ããŠãå°éäžèœãªãªããžã§ã¯ãã®ãµã€ã¯ã«ãç¹å®ããŠç Žå£ããŸãã
- ã¡ã¢ãªäœ¿çšéãç£èŠããïŒ ã¡ã¢ãªäœ¿çšéãç£èŠããŠãæœåšçãªã¡ã¢ãªãªãŒã¯ãæ€åºããŸãããããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãæ£ããè§£æŸãããŠããªããªããžã§ã¯ããç¹å®ããŸãã
- åç §ã«ãŠã³ãæäœãæé©åããïŒ åç §ã«ãŠã³ãæäœãæé©åããŠãªãŒããŒããããåæžããŸããããã©ãŒãã³ã¹ãåäžãããããã«ãé å»¶åç §ã«ãŠã³ããã©ã€ãããªã¢ãªã©ã®ææ³ãæ€èšããŠãã ããã
- ãã¬ãŒããªããèæ ®ããïŒ åç §ã«ãŠã³ããšä»ã®ã¡ã¢ãªç®¡çææ³ãšã®ãã¬ãŒããªããè©äŸ¡ããŸããåç §ã«ãŠã³ãã¯ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠæè¯ã®éžæè¢ã§ã¯ãªãå ŽåããããŸããæ±ºå®ãäžãéã«ã¯ãåç §ã«ãŠã³ãã®è€éãããªãŒããŒããããããã³å¶éãèæ ®ããŠãã ããã
çµè«
åç §ã«ãŠã³ãã¯ãå³æè§£æŸãšã·ã³ãã«ããæäŸãã貎éãªã¡ã¢ãªç®¡çææ³ã§ããããããåç°åç §ãåŠçã§ããªãããšã¯é倧ãªå¶éã§ããããŒã¯ã¢ã³ãã¹ã€ãŒãããµã€ã¯ã«æ€åºã¢ã«ãŽãªãºã ãªã©ã®åŸªç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ææ³ãå®è£ ããããšã§ããã®å¶éãå æããã¡ã¢ãªãªãŒã¯ã®ãªã¹ã¯ãªãã«åç §ã«ãŠã³ãã®å©ç¹ã享åã§ããŸããåç §ã«ãŠã³ãã«é¢é£ãããã¬ãŒããªããšãã¹ããã©ã¯ãã£ã¹ãçè§£ããããšã¯ãå ç¢ã§å¹ççãªãœãããŠã§ã¢ã·ã¹ãã ãæ§ç¯ããããã«äžå¯æ¬ ã§ããã¢ããªã±ãŒã·ã§ã³ã®ç¹å®ã®èŠä»¶ãæ éã«æ€èšããå¿ èŠã«å¿ããŠåŸªç°ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãçµã¿èŸŒãã§åç°åç §ã®èª²é¡ã軜æžããããŒãºã«æãé©ããã¡ã¢ãªç®¡çæŠç¥ãéžæããŠãã ãããå¹ççãªã¡ã¢ãªäœ¿çšéã確ä¿ããæœåšçãªã¡ã¢ãªãªãŒã¯ãé²ãããã«ãã³ãŒãã®ãããã¡ã€ãªã³ã°ãšæé©åãå¿ããªãã§ãã ããã