ęœ€ēµ‚ę›“ę–°ę—„ę™‚:
ćŒę›“ę–°

屄歓 編集

function
<memory>

std::shared_ptr::ćƒ‡ć‚¹ćƒˆćƒ©ć‚Æć‚æ(C++11)

~shared_ptr();           // (1) C++11
constexpr ~shared_ptr(); // (1) C++26

shared_ptrć‚Ŗćƒ–ć‚øć‚§ć‚Æćƒˆć®ē “ę£„

č‡Ŗčŗ«ć®ćæćŒę‰€ęœ‰ęØ©ć‚’ęŒć¤å “åˆć«ć€ćƒŖć‚½ćƒ¼ć‚¹ć‚’č§£ę”¾ć™ć‚‹ć€‚

åŠ¹ęžœ

他恮shared_ptrć‚Ŗćƒ–ć‚øć‚§ć‚ÆćƒˆćØćƒŖć‚½ćƒ¼ć‚¹ć‚’å…±ęœ‰ć—ć¦ć„ć‚‹å “åˆ(use_count() > 1)ć€åŠ¹ęžœćŖć—ć€‚

č‡Ŗčŗ«ć®ćæćŒshared_ptrć‚Ŗćƒ–ć‚øć‚§ć‚Æćƒˆć®ćƒŖć‚½ćƒ¼ć‚¹ć‚’ę‰€ęœ‰ć—ć¦ć„ć‚‹å “åˆć€ć‚³ćƒ³ć‚¹ćƒˆćƒ©ć‚Æć‚æć€ä»£å…„ę¼”ē®—å­ć€reset()ćƒ”ćƒ³ćƒé–¢ę•°ć§ä»£å…„ć•ć‚ŒćŸY*åž‹ć®ćƒć‚¤ćƒ³ć‚æp恫恤恄恦态

  • ćƒ‡ćƒŖćƒ¼ć‚æć‚’ęŒć£ć¦ć„ć‚Œć°d(p)ć§ćƒŖć‚½ćƒ¼ć‚¹ć‚’č§£ę”¾ć™ć‚‹ć€‚
  • ćƒ‡ćƒŖćƒ¼ć‚æć‚’ęŒć£ć¦ć„ćŖć‘ć‚Œć°ć€delete pć§ćƒŖć‚½ćƒ¼ć‚¹ć‚’č§£ę”¾ć™ć‚‹ć€‚

pがT*åž‹ć§ćÆćŖćY*åž‹ć§ć‚ć‚‹ć“ćØć«ę³Øę„ć€‚ć“ć‚Œć«ć‚ˆć‚Šć€shared_ptr<void>ć«åÆ¾ć—ć¦ä»»ę„ć®åž‹Yć®ć‚Ŗćƒ–ć‚øć‚§ć‚Æćƒˆćøć®ćƒć‚¤ćƒ³ć‚æć‚’ä»£å…„ć—ćŸćØć—ć¦ć‚‚ć€Yåž‹ć®ćƒ‡ć‚¹ćƒˆćƒ©ć‚Æć‚æćŒę­£ć—ćå®Ÿč”Œć•ć‚Œć‚‹ć€‚

å‚™č€ƒ

å®Ÿéš›ć«ćÆshared_ptrćÆå‚ē…§ć‚«ć‚¦ćƒ³ćƒˆć§å®Ÿč£…ć•ć‚Œć‚‹ćŸć‚ć€ä»–ć®shared_ptrć‚Ŗćƒ–ć‚øć‚§ć‚ÆćƒˆćØę‰€ęœ‰ęØ©ć‚’å…±ęœ‰ć—ć¦ć„ć‚‹ēŠ¶ę…‹ć§ćƒ‡ć‚¹ćƒˆćƒ©ć‚Æć‚æćŒå®Ÿč”Œć•ć‚ŒćŸå “åˆć€å‚ē…§ć‚«ć‚¦ćƒ³ćƒˆć‚’1ęø›ć‚‰ć™ć€ćØć„ć†ć“ćØć‚’č”Œć†ć€‚

例

#include <iostream>
#include <memory>

struct X {
  ~X()
  {
    std::cout << "X dtor" << std::endl;
  }
};

struct Y {
  ~Y()
  {
    std::cout << "Y dtor" << std::endl;
  }
};

int main()
{
  std::shared_ptr<void> p(new X());

  std::cout << 0 << std::endl;

  p.reset(new Y()); // XćŒē “ę£„ć•ć‚Œć‚‹

  std::cout << 1 << std::endl;
} // YćŒē “ę£„ć•ć‚Œć‚‹

å‡ŗåŠ›

0
X dtor
1
Y dtor

å‚ē…§

  • P3037R6 constexpr std::shared_ptr and friends
  • LWG Issue 899. Adjusting shared_ptr for nullptr_t
    • C++11ć§ć€å‰Šé™¤å­ć‚’å‘¼ć³å‡ŗć™ę”ä»¶ć®čØ˜čæ°ćŒć€Œćƒć‚¤ćƒ³ć‚æpć‚’ę‰€ęœ‰ć—ć¦ć„ć‚‹å “åˆć€ć‹ć‚‰ć€Œć‚Ŗćƒ–ć‚øć‚§ć‚Æćƒˆpć‚’ę‰€ęœ‰ć—ć¦ć„ć‚‹å “åˆć€ćøę”¹ć‚ć‚‰ć‚ŒćŸć€‚nullptrćØå‰Šé™¤å­ć‹ć‚‰ę§‹ēÆ‰ć—ćŸshared_ptrć§ć‚‚å‰Šé™¤å­ćŒå‘¼ć°ć‚Œć‚‹ć“ćØć‚’ę˜Žē¢ŗć«ć™ć‚‹ćŸć‚