рд╢реЗрдпрд░реНрдб_рдкреНрдЯреНрд░ рдХреНрд▓рд╛рд╕ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬреЛ рдХрдИ рдбреЗрд╡рд▓рдкрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрд╕рдХреА рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░рд╛ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬреЛ рдЕрднреА рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛:
- рдХреНрд░реЙрд╕ рд░реЗрдлрд░реЗрдВрд╕ рдХреНрдпрд╛ рд╣реИрдВ
- рдЦрддрд░рдирд╛рдХ рдЕрдирдореЛрд▓ рд╕рд╛рдЭрд╛_рдкреНрд░рддрд┐ рдХреНрдпрд╛ рд╣реИрдВ;
- рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╢реЗрдпрд░реНрдб_рдкреНрдЯреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреНрдпрд╛ рдЦрддрд░реЗ рд╣реИрдВ;
- рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд░рд┐рд▓реАрдЬрд╝ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╕рдордп рдХреНрдпрд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ;
- enable_sared_from_this рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдХреНрдпрд╛ рд╣реИрдВред
рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛рдПрдВ рджреЛрдиреЛрдВ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИрдВ :: share_ptr рдФрд░ std :: share_ptr рдХреЗ рд▓рд┐рдПред рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рд╡рд░реНрдгрд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдкреВрд░реНрдг рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрди рдорд┐рд▓реЗрдЧрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреВрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА)ред
рдХреНрд░реЙрд╕ рд╕рдВрджрд░реНрдн
рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рд╣реИ рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╢реЗрдпрд░реНрдб_рдПрдкреНрдЯреНрд░ рдкреЙрдЗрдВрдЯрд░ рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред Share_ptr рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╡рд╛рд▓реА рд╡рд╕реНрддреБ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрд╛рдЙрдВрдЯрд░ рд╕рднреА рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред

рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдорд╛рди 1 рдЗрд╕рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдХреЙрдкреА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ 1 рд╕реЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╛ рдЬрдм рд╕реВрдЪрдХ рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рд░реАрд╕реЗрдЯ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ), рдХрд╛рдЙрдВрдЯрд░ 1 рд╕реЗ рдШрдЯ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
struct Widget { shared_ptr<Widget> otherWidget; }; void foo() { shared_ptr<Widget> a(new Widget); shared_ptr<Widget> b(new Widget); a->otherWidget = b;
рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдмреА рдЧреБрдВрдЬрд╛рдЗрд╢ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ? рд╡рд┐рдирд╛рд╢рдХрд╛рд░реА рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХрдореА рдЖрдПрдЧреАред рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдХрд╛рдЙрдВрдЯрд░ = 1 рд╣реЛрдЧрд╛ (рдЖрдЦрд┐рд░рдХрд╛рд░, рдЕрднреА рднреА рдмреА рдФрд░ рдмреА рдХреЗ рдЕрдВрдХ)ред рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ "рдкрдХрдбрд╝" рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ - рдпреЗ рдСрдмреНрдЬреЗрдХреНрдЯ "рдЦреЛ рдЧрдП" рд╣реИрдВред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП weak_ptr рд╣реИред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд░реЙрд╕-рд░реЗрдлрд░реЗрдВрд╕ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реЛрддрд╛ рд╣реИред
struct RootWidget { list<shared_ptr<class Widget> > widgets; }; struct Widget { shared_ptr<class RootWidget> parent; };
рдЗрд╕ рддрд░рд╣ рдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдЬреЗрдЯ рд░реВрдЯрд╡рд┐рдбрдЧреЗрдЯ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: "рдХреМрди рдХрд┐рд╕рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ?"ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд░реВрдЯрд╡рд┐рдЬреЗрдЯ рд╣реИ рдЬреЛ рд╡рд┐рдЬреЗрдЯ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
struct Widget { weak_ptr<class RootWidget> parent; };
рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд╣рдЯрд╛рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХрддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рддрд╛рдХрдд рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
1) рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╢реЗрдпрд░реНрдб_рдкреНрдЯреНрд░
weak_ptr<Widget> w = тАж;
2) рддрд╛рд▓рд╛ рд╡рд┐рдзрд┐
weak_ptr<Widget> w = тАж;
рдирд┐рд╖реНрдХрд░реНрд╖:рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рд▓реВрдкрдмреИрдХ рд▓рд┐рдВрдХ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП weak_ptr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реИрдВ
рдЕрдирд╛рдо рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рдорд╕реНрдпрд╛ "рдЕрдиреБрдХреНрд░рдо рдЕрдВрдХ" рдХреЗ рдореБрджреНрджреЗ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреА рд╣реИ
рдЗрди рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рд╕реЗ, рдкреНрд░рд▓реЗрдЦрди рдХреА рд╕рд▓рд╛рд╣ рд╣реИ рдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рджреВрд╕рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рд╕рдВрдХреЗрдд рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдо рджреЗрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрд╣рд╛рдВ рдмрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
int bar() { throw std::runtime_error(тАЬException from bar()тАЭ); }
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбрд┐рдЬрд╝рд╛рдЗрди рдСрд░реНрдбрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рдм рд╡рд┐рд╢реЗрд╖ рд╕рдВрдХрд▓рдХ рдФрд░ рд╕рдВрдХрд▓рди рдЭрдВрдбреЗ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
- рдирдпрд╛ рд╡рд┐рдЬреЗрдЯ
- рдмрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓
- share_ptr рдирд┐рд░реНрдорд╛рдг
- рдлреВ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдк рдХреЗрд╡рд▓ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлреВ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЕрдВрддрд┐рдо рдХреНрд░рд┐рдпрд╛ рд╣реЛрдЧреА, рдФрд░ рд╢реЗрдпрд░_рдкреНрдЯреНрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдСрдмреНрдЬреЗрдХреНрдЯ (рдирдпрд╛ рд╡рд┐рдЬреЗрдЯ) рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдмрд╛рдд рдХреА рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╡рд╕реНрддреБ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдпрджрд┐ рджреВрд╕рд░реЗ рдЪрд░рдг рдХреЗ рджреМрд░рд╛рди рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛), рддреЛ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рд╛рдЭрд╛_рдкреНрд░рддрд┐ рдЕрднреА рддрдХ рдЗрд╕рдХрд╛ рдорд╛рд▓рд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рд┐рдВрдХ рдЦреЛ рдЬрд╛рдПрдЧрд╛ред рдореИрдВрдиреЗ gcc 4.7.2 рдкрд░ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдХреЙрд▓ рдХрд╛ рдХреНрд░рдо рдРрд╕рд╛ рдерд╛ рдХрд┐ рд╕рд╛рдЭрд╛рдХрд░рдг рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ new_ptr + рдирдпрд╛, рдмрд╛рд░ рдХреЛ рдХреЙрд▓ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рд╕рд┐рд░реНрдл рдРрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ - рдЗрд╕рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИред рдореИрдВ рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ рдпрджрд┐ рд╡реЗ рдореБрдЭреЗ рд╕рдВрдХрд▓рдХ, рдЗрд╕рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рд╕рдВрдХрд▓рди рд╡рд┐рдХрд▓реНрдк рдмрддрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред
рдЕрдирд╛рдо рд╢реЗрдпрд░реНрдб_рдкрд╛рд░реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЗрд░реНрдж-рдЧрд┐рд░реНрдж рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдореЗрдХ_рд╢реЗрдпрд░ рдпрд╛ рдЖрдмрдВрдЯрд┐рдд_рд╕рдХреНрд░рд┐рдп рдХрд╛рд░реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
foo( make_shared<Widget>(), bar() );
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдореВрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рднреА рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ (рд╣рдо рд▓реЗрдЦ рдХреЗ рдмрд╛рд╣рд░ рджрдХреНрд╖рддрд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ)ред рдЪрд▓рд┐рдП рдХрд┐рд╕реА рднреА рдирдВрдмрд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде make_saring рдХреЙрд▓ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдХреЛрдб рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВрдЧрд╛ред
make_shared<string>("shared string");
рдирд┐рд╖реНрдХрд░реНрд╖:рднрд▓реЗ рд╣реА рдХреЛрдб рдЗрд╕ рд╕реЗ рдХрдо рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рдпрд╛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ
make_sared рдФрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░реЗрдВ_рд╢рд░рд╛рдм рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛
Share_ptr рдореЗрдВ рд▓рд┐рдВрдХ рдХреА рдЧрд┐рдирддреА рдПрдХ рдкрд░рдорд╛рдгреБ рдХрд╛рдЙрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИред рд╣рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдПрдХ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╕рдВрджрд░реНрдн рдЧрдгрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рд╕реНрд╡рдпрдВ рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИ)ред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рд╕рд╛рдЭрд╛_рдкреНрд░реАрдд рд╣реИ:
shared_ptr<Widget> globalSharedPtr(new Widget); void read() { shared_ptr<Widget> x = globalSharedPtr;
рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рд╕реЗ рд░реАрдб рдХреЙрд▓ рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ (рдЬрдм рддрдХ рдЖрдк рд╡рд┐рдЬреЗрдЯ рдкрд░ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ)ред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдПрдХ рдФрд░ рд╕рдорд╛рд░реЛрд╣ рд╣реИ:
void write() { globalSharedPtr.reset( new Widget ); }
Share_ptr рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдПрдХ рдХреЛрдб рджреВрдВрдЧрд╛ рдЬреЛ рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдпрд╣ рдХреЛрдб рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИред
shared_ptr::shared_ptr(const shared_ptr<T>& x) { A1: pointer = x.pointer; A2: counter = x.counter; A3: atomic_increment( *counter ); } shared_ptr<T>::reset(T* newObject) { B1: if( atomic_decrement( *counter ) == 0 ) { B2: delete pointer; B3: delete counter; B4: } B5: pointer = newObject; B6: counter = new Counter; }
рдорд╛рди рд▓реЗрдВ рдХрд┐ рдкрд╣рд▓рд╛ рдереНрд░реЗрдб GlobalSaringPtr (рдкрдврд╝рд╛) рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдереНрд░реЗрдб рдХреЙрд▓ рдЙрд╕реА рдкреЙрдЗрдВрдЯрд░ рдЙрджрд╛рд╣рд░рдг (рд▓рд┐рдЦрдиреЗ) рдХреЗ рд▓рд┐рдП рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
- рдереНрд░реЗрдб 1 рдиреЗ рд▓рд╛рдЗрди рдП 2 рдХреЛ рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рдП 3 (рдкрд░рдорд╛рдгреБ рд╡реЗрддрди рд╡реГрджреНрдзрд┐) рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
- рд╕реНрдЯреНрд░реАрдо 2 рдиреЗ рдЗрд╕ рд╕рдордп рд▓рд╛рдЗрди рдмреА 1 рдкрд░ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛, рджреЗрдЦрд╛ рдХрд┐ рдШрдЯрдиреЗ рдХреЗ рдмрд╛рдж рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдп рд╣реЛ рдЧрдпрд╛ рдФрд░ рд▓рд╛рдЗрдиреЛрдВ рдмреА 2 рдФрд░ рдмреА 3 рдХреЛ рдкреВрд░рд╛ рдХрд┐рдпрд╛ред
- рдереНрд░реЗрдб 1 рд▓рд╛рдЗрди рдП 3 рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ рдФрд░ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдкрд░рдорд╛рдгреБ рд░реВрдк рд╕реЗ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдзрд╛рд░рд╛ 2 рдкрд░ рд╕реНрдЯреНрд░реАрдо 1 рдореЗрдВ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдЯреНрд░реАрдо 2 рд╕реЗ рдкрд╣рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдЯреНрд░реАрдо 2 рдХреА рдЧрд┐рдирддреА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рджред рддрдм рд╣рдореЗрдВ рд░рд┐рдореЛрдЯ рдХрд╛рдЙрдВрдЯрд░ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдирдпрд╛ рд╢реЗрдпрд░реНрдб_рдПрдкреНрдЯ рдорд┐рд▓рддрд╛ рд╣реИред
рдЖрдк рд╕рдорд╛рди рдХреЛрдб рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
shared_ptr<Widget> globalSharedPtr(new Widget); mutex_t globalSharedPtrMutex; void resetGlobal(Widget* x) { write_lock_t l(globalSharedPtrMutex); globalSharedPtr.reset( x ); } shared_ptr<Widget> getGlobal() { read_lock_t l(globalSharedPtrMutex); return globalSharedPtr; } void read() { shared_ptr<Widget> x = getGlobal();
рдЕрдм, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рд╛рдЭрд╛_рдкреНрдЯреНрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖: рдпрджрд┐ рдХреБрдЫ рд╕рд╛рдЭрд╛_рдкрд╛рд░реНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереНрд░реЗрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рд╢реЗрдпрд░реНрдб_рдкрд╛рд░реНрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реЛрдЧрд╛ред
Share_ptr рдХреЗ рд▓рд┐рдП рд░рд┐рд▓реАрдЬрд╝ рдлрд╝рд╛рдЗрдЯрд░ рдХреЗ рд╡рд┐рдирд╛рд╢ рд╕рдордп рдХреА рдЦрд╝рд╛рд╕рд┐рдпрдд
рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЗрд╡рд▓ рддрднреА рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдЖрдк рдХрдордЬреЛрд░ рдмрд┐рдВрджреБрдУрдВ (рдХрдордЬреЛрд░_рдкреНрд░рддрд┐) рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рдлрд╝рд╛рдЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рд▓реЛрдкрди рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдирдИ рдХреНрд░рд┐рдпрд╛ (рдореВрд▓ рд░реВрдк рд╕реЗ "рдбреЗрдХреЛрд░реЗрдЯрд░" рдЯреЗрдореНрдкреНрд▓реЗрдЯ) рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдФрд░ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдЖрдзрд╛рд░ рдкрд░ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓ рд╕реЗ рд╣рдЯрд╛рдХрд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЬрдм рдХреНрд▓рд╛рдЗрдВрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЦрддреНрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╡рд╛рдкрд╕ рдкреВрд▓ рдореЗрдВ рд▓реМрдЯрд╛ рджреЗрдВред
typedef shared_ptr<Connection> ptr_t; class ConnectionReleaser { list<ptr_t>& whereToReturn; ptr_t connectionToRelease; public: ConnectionReleaser(list<ptr_t>& lst, const ptr_t& x):whereToReturn(lst), connectionToRelease(x) {} void operator()(Connection*) { whereToReturn.push_back( connectionToRelease );

рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдлрд╝рдиреНрддреЗрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ share_ptr рдХреЗ рд▓рд┐рдП рд╣реА рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рднреА рд╕рдВрджрд░реНрдн рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ - рджреЛрдиреЛрдВ рдордЬрдмреВрдд (рд╕рд╛рдЭрд╛_рдкреНрд░рддрд┐) рдФрд░ рдХрдордЬреЛрд░ (weak_ptr)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЕрдЧрд░ ConnectionReleaser рдкреЙрдЗрдВрдЯрд░ рдХреЛ "рд░рд┐рд▓реАрдЬрд╝" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдкрд╛рд╕ (рдХрдиреЗрдХреНрд╢рдирдЯреЙрдЗрд▓реЗрдЬрд╝) рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рддрдм рддрдХ рдПрдХ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рд░рдЦреЗрдЧрд╛, рдЬрдм рддрдХ рдХрд┐ getConnection рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рд╛рдЭрд╛_ptr рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдХрдордЬреЛрд░_рдкрд░рдЯрд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХрд╛ рдХрд╛рдлреА рдЕрдкреНрд░рд┐рдп рдФрд░ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рдмрд╛рдЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рд▓реАрдЬрд╝ рдлрд╝рд┐рдХреНрд╕рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
void releaseConnection(std::list<ptr_t>& whereToReturn, ptr_t& connectionToRelease) { whereToReturn.push_back( connectionToRelease );
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЗрд╕реЗ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ (рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдорд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ :: рд░реЗрдлрд░реА), рдФрд░ рдпрджрд┐ рдЙрдирдХреЗ рдмреАрдЪ share_ptr рд╣реИ, рддреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рднреА рд╕рд╛рдлрд╝ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирд┐рд╖реНрдХрд░реНрд╖: рд░рд┐рд▓реАрдЬрд╝ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдВрддрд┐рдо рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдХреЛ рддреЛрдбрд╝рдиреЗ рдкрд░ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рднреА рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП_рдкреНрд░рддрд┐ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ, рдЬреЛ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХреЗ рдлрд╝рдиреНрдХреНрдЯрд░ рдХреЗ рд╕рджрд╕реНрдп рд╣реИрдВред рдпрджрд┐ рдЖрдк рдмрд╛рдЗрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдпрд╣ рдЙрд╕рдХреЗ рдкрд╛рд╕ рджрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИред
Enable_sared_from_this рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ
рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рд╕реЗ рдПрдХ рдирдпрд╛ рд╕рд╛рдЭрд╛_рдкрд╛рда рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдиреЗ рд╕реЗ рдШреБрд╕рдкреИрда рд╡реНрдпрд╡рд╣рд╛рд░ (рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛), рдШреБрд╕рдкреИрда_рдкрд░ рдХреЗ рд╡рд┐рдкрд░реАрдд рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрдо рдмрд╛рдд рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреНрд░рд╡реЗрд╢ рдХрдХреНрд╖рд╛ рдореЗрдВ enable_sared_from_this рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
Enable_sared_from_this рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рд╡рд░реНрдЧ рдореЗрдВ рдХрдордЬреЛрд░_рдкреНрд░рддрд┐ рд╣реИ, рдЬреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╢реЗрдпрд░реНрдб_рдлреЙрдо_рдерд┐рд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдордЬреЛрд░_рдкреНрдЯреНрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╢реЗрдпрд░реНрдб_рдкреНрдЯреНрд░ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдпреЛрдЬрдирд╛рдмрджреНрдз рд░реВрдк рд╕реЗ, рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
template<class T> class enable_shared_from_this { weak_ptr<T> weak_this_; public: shared_ptr<T> shared_from_this() {
рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП share_ptr рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
shared_ptr::shared_ptr(T* object) { pointer = object; counter = new Counter; object->weak_this_ = *this; }
рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдХрдордЬреЛрд░_рдерд┐рд╕_ рдЕрднреА рднреА рдХреБрдЫ рднреА рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдирд┐рд░реНрдорд╛рдг рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ share_ptr рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╕рд╣реА рд▓рд┐рдВрдХ рдЗрд╕рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рд╕рд╛рдЭрд╛_рдлреНрд░реЗрдо_рдерд┐рд╕ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рднреА рдкреНрд░рдпрд╛рд╕ рдЦрд░рд╛рдм_рд╡рд╛рдХ_рдкреНрд░рддрд┐ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджреЗрдЧрд╛ред
struct BadWidget: public enable_shared_from_this<BadWidget> { BadWidget() {
рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╕реЗ рд╕рд╛рдЭрд╛_рдлреНрд░реЗрдо_рдерд┐рд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдПрдХ рд╣реА рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП: рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЗ рд╕рдордп, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдЗрд╕реЗ рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдХрд╛рдЙрдВрдЯрд░ рдбреАрдХреНрд░рд┐рдПрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
struct BadWidget: public enable_shared_from_this<BadWidget> { ~BadWidget() {
рджреВрд╕рд░реЗ рдорд╛рдорд▓реЗ (рд╡рд┐рдзреНрд╡рдВрд╕рдХ) рдХреЗ рд╕рд╛рде, рдереЛрдбрд╝рд╛ рд╕реЛрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдзреНрдпрд╛рди рд░рдЦрдирд╛ рд╣реИ рдХрд┐ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП_рдлреНрд░реЗрдо_рдерд┐рд╕ рдХреЛ рдХреЙрд▓ рди рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдкрд╣рд▓рд╛ рдорд╛рдорд▓рд╛ рдереЛрдбрд╝рд╛ рд╕рд░рд▓ рд╣реИред рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рддрдп рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреА рд╡рд╕реНрддреБ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ share_ptr рд╣реИ, рдлрд┐рд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдХрдХреНрд╖рд╛ рдХреЗ рдирд┐рдЬреА рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реЗрдпрд░реНрдб_ptr рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ рдЙрдЪрд┐рдд рд╣реЛрдЧрд╛ред рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рдЖрдкрдХреЛ рдРрд╕реА рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
class GoodWidget: public enable_shared_from_this<GoodWidget> { void init() { cout << shared_from_this() << endl; } public: static shared_ptr<GoodWidget> create() { shared_ptr<GoodWidget> p(new GoodWidget); p->init(); return p; } };
рдирд┐рд╖реНрдХрд░реНрд╖:рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ (рдкреНрд░рддреНрдпрдХреНрд╖ рдпрд╛ рдЕрдкреНрд░рддреНрдпрдХреНрд╖) рд╕рд╛рдЭрд╛_рдлреНрд░реЗрдо_рдерд┐рд╕ рд╕реЗ рдмрдЪреЗрдВред рдпрджрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдЙрдЪрд┐рдд рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рд╛рдЭрд╛_рдлреНрд░реЗрдо_рдерд┐рд╕ рддрдХ рдкрд╣реБрдБрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: init рдореЗрдердб рдмрдирд╛рдПрдБ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реНрдЯреИрдЯрд┐рдХ рдореЗрдердб рдореЗрдВ рдбреЗрд▓рд┐рдЧреЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдмрдирд╛рдПрдВ рддрд╛рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗрд╡рд▓ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЖрд▓реЗрдЦ рд╕рд╛рдЭрд╛_рдкреНрд░рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА 5 рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐ рд╢реЗрдпрд░реНрдб_рдПрдкреНрдЯреНрд░ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рджреВрд░ рдХрд░рддрд╛ рд╣реИ, рд╢реЗрд░реНрд▓_рдкреНрдЯреНрд░ рдХреЗ рд╕рдореБрдЪрд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рдбрд┐рд╡рд╛рдЗрд╕ (рд▓рдЧрднрдЧ) рдХрд╛ рдЬреНрдЮрд╛рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИред рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЧрдП рдбрд┐рд╡рд╛рдЗрд╕, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВред рдХрдИ рд╕рд░рд▓ рдирд┐рдпрдореЛрдВ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрд╡рд╛рдВрдЫрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рд╣рд┐рддреНрдп
- Boost.org рдкреНрд░рд▓реЗрдЦрди
- рд╕реНрдХреЙрдЯ Meyers "рдФрд░ рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╕реА ++: 35 рдирдП рддрд░реАрдХреЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдФрд░ рдбрд┐рдЬрд╛рдЗрдиреЛрдВ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП"
рдЖрд╡реЗрджрди
рдкрд░рд┐рд╢рд┐рд╖реНрдЯ рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдорд╛рдорд▓реЛрдВ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рдкреВрд░реНрдг рдкрд╛рда рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рд░рд┐рдВрдЧ рд▓рд┐рдВрдХ рдЬрд╛рд░реА рдХрд░рдирд╛ рдкреНрд░рджрд░реНрд╢рди #include <string> #include <iostream> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> class BadWidget { std::string name; boost::shared_ptr<BadWidget> otherWidget; public: BadWidget(const std::string& n):name(n) { std::cout << "BadWidget " << name << std::endl; } ~BadWidget() { std::cout << "~BadWidget " << name << std::endl; } void setOther(const boost::shared_ptr<BadWidget>& x) { otherWidget = x; std::cout << name << " now points to " << x->name << std::endl; } }; class GoodWidget { std::string name; boost::weak_ptr<GoodWidget> otherWidget; public: GoodWidget(const std::string& n):name(n) { std::cout << "GoodWidget " << name << std::endl; } ~GoodWidget() { std::cout << "~GoodWidget " << name << std::endl; } void setOther(const boost::shared_ptr<GoodWidget>& x) { otherWidget = x; std::cout << name << " now points to " << x->name << std::endl; } }; int main() { { // std::cout << "====== Example 3" << std::endl; boost::shared_ptr<BadWidget> w1(new BadWidget("3_First")); boost::shared_ptr<BadWidget> w2(new BadWidget("3_Second")); w1->setOther( w2 ); w2->setOther( w1 ); } { // weak_ptr std::cout << "====== Example 3" << std::endl; boost::shared_ptr<GoodWidget> w1(new GoodWidget("4_First")); boost::shared_ptr<GoodWidget> w2(new GoodWidget("4_Second")); w1->setOther( w2 ); w2->setOther( w1 ); } return 0; }
рдХрдордЬреЛрд░_рдкреНрд░рддрд┐ рдХреЛ рд╕рд╛рдЭрд╛_рдкреНрд░рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди #include <iostream> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> class Widget {}; int main() { boost::weak_ptr<Widget> w; // weak_ptr // lock std::cout << __LINE__ << ": " << w.lock().get() << std::endl; // shared_ptr try { boost::shared_ptr<Widget> tmp ( w ); } catch (const boost::bad_weak_ptr&) { std::cout << __LINE__ << ": bad_weak_ptr" << std::endl; } boost::shared_ptr<Widget> p(new Widget); // weak_ptr w = p; // lock std::cout << __LINE__ << ": " << w.lock().get() << std::endl; // shared_ptr . std::cout << __LINE__ << ": " << boost::shared_ptr<Widget>( w ).get() << std::endl; // p.reset(); // . weak_ptr // lock std::cout << __LINE__ << ": " << w.lock().get() << std::endl; // shared_ptr try { boost::shared_ptr<Widget> tmp ( w ); } catch (const boost::bad_weak_ptr&) { std::cout << __LINE__ << ": bad_weak_ptr" << std::endl; } return 0; }
Share_ptr рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди #include <iostream> #include <boost/thread.hpp> #include <boost/shared_ptr.hpp> typedef boost::shared_mutex mutex_t; typedef boost::unique_lock<mutex_t> read_lock_t; typedef boost::shared_lock<mutex_t> write_lock_t; mutex_t globalMutex; boost::shared_ptr<int> globalPtr(new int(0)); const int readThreads = 10; const int maxOperations = 10000; boost::shared_ptr<int> getPtr() { // , read_lock_t l(globalMutex); return globalPtr; } void resetPtr(const boost::shared_ptr<int>& x) { // , write_lock_t l(globalMutex); globalPtr = x; } void myRead() { for(int i = 0; i < maxOperations; ++i) { boost::shared_ptr<int> p = getPtr(); } } void myWrite() { for(int i = 0; i < maxOperations; ++i) { resetPtr( boost::shared_ptr<int>( new int(i)) ); } } int main() { boost::thread_group tg; tg.create_thread( &myWrite ); for(int i = 0; i < readThreads; ++i) { tg.create_thread( &myRead ); } tg.join_all(); return 0; }
рдбрд┐рд▓реЗрдЯрд░ + рдХрдордЬреЛрд░_рдкреНрд░рддрд┐ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди #include <string> #include <list> #include <iostream> #include <stdexcept> #include <boost/shared_ptr.hpp> #include <boost/weak_ptr.hpp> #include <boost/bind.hpp> class Connection { std::string name; public: const std::string& getName() const { return name; } explicit Connection(const std::string& n):name(n) { std::cout << "Connection " << name << std::endl; } ~Connection() { std::cout << "~Connection " << name << std::endl; } }; typedef boost::shared_ptr<Connection> ptr_t; class ConnectionPool { std::list<ptr_t> connections; // deleter (get1) class ConnectionReleaser { std::list<ptr_t>& whereToReturn; ptr_t connectionToRelease; public: ConnectionReleaser(std::list<ptr_t>& lst, const ptr_t& x):whereToReturn(lst), connectionToRelease(x) {} void operator()(Connection*) { whereToReturn.push_back( connectionToRelease ); std::cout << "get1: Returned connection " << connectionToRelease->getName() << " to the list" << std::endl; // . connectionToRelease.reset(); } }; // deleter (get2) static void releaseConnection(std::list<ptr_t>& whereToReturn, ptr_t& connectionToRelease) { whereToReturn.push_back( connectionToRelease ); std::cout << "get2: Returned connection " << connectionToRelease->getName() << " to the list" << std::endl; // connectionToRelease.reset(); } ptr_t popConnection() { if( connections.empty() ) throw std::runtime_error("No connections left"); ptr_t w( connections.back() ); connections.pop_back(); return w; } public: ptr_t get1() { ptr_t w = popConnection(); std::cout << "get1: Taken connection " << w->getName() << " from list" << std::endl; ptr_t r( w.get(), ConnectionReleaser( connections, w ) ); return r; } ptr_t get2() { ptr_t w = popConnection(); std::cout << "get2: Taken connection " << w->getName() << " from list" << std::endl; ptr_t r( w.get(), boost::bind(&releaseConnection, boost::ref(connections), w )); return r; } void add(const std::string& name) { connections.push_back( ptr_t(new Connection(name)) ); } ConnectionPool() { std::cout << "ConnectionPool" << std::endl; } ~ConnectionPool() { std::cout << "~ConnectionPool" << std::endl; } }; int main() { boost::weak_ptr<Connection> weak1; boost::weak_ptr<Connection> weak2; { ConnectionPool cp; cp.add("One"); cp.add("Two"); ptr_t p1 = cp.get1(); weak1 = p1; ptr_t p2 = cp.get2(); weak2 = p2; } std::cout << "Here the ConnectionPool is out of scope, but weak_ptrs are not" << std::endl; return 0; }
Enable_sared_from_this рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди #include <iostream> #include <boost/shared_ptr.hpp> #include <boost/enable_shared_from_this.hpp> class BadWidget1: public boost::enable_shared_from_this<BadWidget1> { public: BadWidget1() { std::cout << "Constructor" << std::endl; std::cout << shared_from_this() << std::endl; } }; class BadWidget2: public boost::enable_shared_from_this<BadWidget2> { public: ~BadWidget2() { std::cout << "Destructor" << std::endl; std::cout << shared_from_this() << std::endl; } }; class GoodWidget: public boost::enable_shared_from_this<GoodWidget> { GoodWidget() {} void init() { std::cout << "init()" << std::endl; std::cout << shared_from_this() << std::endl; } public: static boost::shared_ptr<GoodWidget> create() { boost::shared_ptr<GoodWidget> p(new GoodWidget); p->init(); return p; } }; int main() { boost::shared_ptr<GoodWidget> good = GoodWidget::create(); try { boost::shared_ptr<BadWidget1> bad1(new BadWidget1); } catch( const boost::bad_weak_ptr&) { std::cout << "Caught bad_weak_ptr for BadWidget1" << std::endl; } try { boost::shared_ptr<BadWidget2> bad2(new BadWidget2); // terminate // .. , } catch( const boost::bad_weak_ptr&) { std::cout << "Caught bad_weak_ptr for BadWidget2" << std::endl; } return 0; }