рд▓реЗрдЦ рдПрдХ рдЦрддрд░рдирд╛рдХ рдПрдВрдЯреАрдкреИрдЯрд░реНрди "рдЬрд╝реЛрдВрдмреА" рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреБрдЫ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдПрд╕рдЯреАрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ :: enable_sared_from_thisред рд╕рд╛рдордЧреНрд░реА рдХрд╣реАрдВ рдЖрдзреБрдирд┐рдХ C ++ рддрдХрдиреАрдХ рдФрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рдЬрдВрдХреНрд╢рди рдкрд░ рд╣реИред
рдкрд░рд┐рдЪрдп
C ++ 11 рдиреЗ рдореЗрдореЛрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд┐рдП - рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ std :: unique_ptr рдФрд░ std рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ :: рд╕рд╛рдЭрд╛_ptr + std :: weak_ptrред рд╕реБрд╡рд┐рдзрд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдЪреНрдЪреЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджреВрд░ рдХрд░рддрд╛ рд╣реИред рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг / рд╡рд┐рд▓реЛрдкрди рдХреА рд╢реБрджреНрдзрддрд╛ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдореБрджреНрджреЛрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред
Std :: enable_sared_from_this рд╡рд░реНрдЧ рдЯреЗрдореНрдкрд▓реЗрдЯ рднреА рдорд╛рдирдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдФрд░ рдЬрдм рдЖрдк рдЗрд╕реЗ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдЬреАрдм рд▓рдЧрддрд╛ рд╣реИред
рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдХреИрд╕реЗ рдлрдВрд╕ рд╕рдХрддреЗ рд╣реИрдВред
рд╢реИрдХреНрд╖рд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдо
RAII рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рд╕реАрдзрд╛ рдЙрджреНрджреЗрд╢реНрдп рдвреЗрд░ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рд░реИрдо рдХреЗ рдЯреБрдХрдбрд╝реЗ рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдирд╛ рд╣реИред рд╕реНрдорд╛рд░реНрдЯ рд╕рдВрдХреЗрдд рдЖрд░рдПрдЖрдИрдЖрдИ рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ (рд╕рдВрд╕рд╛рдзрди рдЕрдзрд┐рдЧреНрд░рд╣рдг рдЖрд░рдВрднреАрдХрд░рдг рд╣реИ) рдФрд░ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрд░рдВрднреАрдХрд░рдг рдФрд░ рдЧреИрд░-рддреБрдЪреНрдЫ рдбреА-рдЖрд░рдВрднреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ:
- рдлрд╛рдЗрд▓реЗрдВ;
- рдбрд┐рд╕реНрдХ рдкрд░ рдЕрд╕реНрдерд╛рдпреА рдлрд╝реЛрд▓реНрдбрд░;
- рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди (http, websockets);
- рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдзрд╛рдЧреЗ (рдереНрд░реЗрдбреНрд╕);
- рдореНрдпреВрдЯреЗрдХреНрд╕;
- рдЕрдиреНрдп (рдЬреЛ рдХрд▓реНрдкрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ)ред
рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрднреА-рдХрднреА рдЖрдк рдПрдХ рдХрдХреНрд╖рд╛ рднреА рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдирд┐рдкреБрдгрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рд▓реЗрдХрд┐рди рдЖрдЬ рдХрд╣рд╛рдиреА рдЙрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╣реИ), рдЬреЛ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ:
- рдирд┐рд░реНрдорд╛рддрд╛ рдпрд╛ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рдЖрд░рдВрднреАрдХрд░рдг;
- рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рд╡рд┐рдШрдЯрди,
рддрдм рдЖрд╡рд╢реНрдпрдХ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдореЙрдбрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╕рдВрдмрдВрдзрд┐рдд рд╕реНрдорд╛рд░реНрдЯ рдореЙрдбрд▓ - рд╕рдВрдпреБрдХреНрдд (std :: share_ptr) рдпрд╛ рдПрдХрдорд╛рддреНрд░ (std :: unique_ptr) рдкрд░ "рд░реИрдк" рдХрд░реЗрдВред рдпрд╣ "рдЯреВ-рд▓реЗрдпрд░ RAII" рдореЗрдВ рдкрд░рд┐рдгрд╛рдорд┐рдд рд╣реЛрддрд╛ рд╣реИ: рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдЖрдкрдХреЛ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЛ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд / рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд░реНрдЧ рдЧреИрд░-рдорд╛рдирдХ рд╕рдВрд╕рд╛рдзрди рдХреЛ рдкреНрд░рд╛рд░рдВрдн / de-initializes рдХрд░рддрд╛ рд╣реИред
std :: shared_ptr рдПрдХ рд▓рд┐рдВрдХ рдЧрд┐рдирддреА рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдорд╛рдирдХ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (std рдХреА рдореМрдЬреВрджрд╛ рдкреНрд░рддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ :: share_ptr) рдФрд░ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреЗ рдХрд╛рдЙрдВрдЯрд░ (std рдХреА рдореМрдЬреВрджрд╛ рдкреНрд░рддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ :: st_ рдХреЗ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛рдИ рдЧрдИ weak_ptr: - Share_ptr)ред рдХрдо рд╕реЗ рдХрдо рдПрдХ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИ рдХрд┐ рд╡рд┐рдирд╛рд╢ рдЕрднреА рддрдХ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдпрд╣ std :: share_ptr рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╡реИрдзрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рднреА рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рдХрд╛рдо рдкреВрд░рд╛ рди рд╣реЛ рдЬрд╛рдПред рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЛ рд░реЛрдХрддреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рддрдм рддрдХ рдПрдХ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдирд╖реНрдЯ рди рд╣реЛ рдЬрд╛рдПред
RAII рдХрд┐рд╕реА рд╕рдВрд╕рд╛рдзрди рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдЯрд╛рдиреЗ / рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИ [] / рдирд┐: рд╢реБрд▓реНрдХ / рдХрд░реАрдм / рд░реАрд╕реЗрдЯ / рд╣рдЯрд╛рдПрдВ:
- рдЖрдк рдмрд╕ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВ;
- рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЙрд▓ рдХреЛ рдЧрд▓рддреА рд╕реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
- рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд╕рд╛рдЭрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЪреБрдиреМрддреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИ;
- c ++ рдореЗрдВ рд╕реНрдЯреИрдХ рдкреНрд░рдореЛрд╢рди рдореИрдХреЗрдирд┐рдЬреНрдо рдЙрди рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рдХреЙрд▓ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЕрдкрд╡рд╛рдж рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рддреЗ рд╣реИрдВред
рдореБрд╣рд╛рд╡рд░реЗ рдореЗрдВ рдбреА-рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреА рдЧрд╛рд░рдВрдЯреА рдЗрддрдиреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдореБрд╣рд╛рд╡рд░реЗ рдХреЗ рдирд╛рдо рдкрд░ рдПрдХ рдЕрдЪреНрдЫреА рдЬрдЧрд╣ рдХреА рд╣рдХрджрд╛рд░ рд╣реИред
рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВ:
- рдкреНрд░рджрд░реНрд╢рди рдФрд░ рд╕реНрдореГрддрд┐ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдУрд╡рд░рд╣реЗрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ (рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ);
- рдЪрдХреНрд░реАрдп рд▓рд┐рдВрдХ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╕рдВрд╕рд╛рдзрди рдХреА рд░рд┐рд╣рд╛рдИ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд░рд┐рд╕рд╛рд╡ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред
рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдкрд░рд┐рдкрддреНрд░ рд▓рд┐рдВрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рдХреЛрдб рдХреЗ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред
рдпрд╣ рдЦрддрд░рд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдорд╣рддреНрд╡рд╣реАрди рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:
- рдпрджрд┐ рд╕реНрдореГрддрд┐ рдмрд╛рд░-рдмрд╛рд░ рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рд▓реАрдХ рдХрд░рддреА рд╣реИ - рдпрд╣ рдЗрд╕рдХреЗ рдЙрдкрднреЛрдЧ рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдФрд░ рдпрджрд┐ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдФрд░ рдереЛрдбрд╝рд╛ - рддреЛ рд╕рдорд╕реНрдпрд╛ рд╕реНрд╡рдпрдВ-рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрддрд░ рдкрд░ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ;
- рд▓реАрдХ рдХреЗ рд▓рд┐рдП рдЧрддрд┐рд╢реАрд▓ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (Valgrind, Clang LeakSanitizer, рдЖрджрд┐);
- "рдореИрдВ рдЙрд╕ рддрд░рд╣ рдирд╣реАрдВ рд▓рд┐рдЦреВрдВрдЧрд╛";
- "рдореЗрд░реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рд╕рд╣реА рд╣реИ";
"рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред"
std :: enable_sared_from_thisC ++ 11 рдореЗрдВ, рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ std :: enable_sared_from_this рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ std :: enable_sared_from_this рдХреЗ рдмрд┐рдирд╛ рдХреЛрдб рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
Std :: enable_sared_from_this рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
рдпрд╣ рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ std рдореЗрдВ рддрддреНрдХрд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ :: shared_ptr рдЕрддрд┐рд░рд┐рдХреНрдд рдордЬрдмреВрдд (рд╕рд╛рдЭрд╛_from_this ()) рдпрд╛ рдХрдордЬреЛрд░ (weak_from_this (), C ++ 17 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА) std рдХреА рдкреНрд░рддрд┐рдпрд╛рдВ :: share_ptr рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ ред рдЖрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ_рдлреНрд░реЙрдо_рдерд┐рд╕ () рдФрд░ рдХрдордЬреЛрд░_рдлреНрд░реЗрдо_рдерд┐рд╕ ()ред
рдЗрддрдиреА рдореЗрд╣рдирдд рдХреНрдпреЛрдВ? рдЖрдк рдмрд╕ рдПрд╕рдЯреАрдбреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :: share_ptr <T> (рдпрд╣)
рдирд╣реАрдВ, рдЖрдк рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╕рднреА std :: share_ptrs рдЬреЛ рдХрдХреНрд╖рд╛ рдХреЗ рдПрдХ рд╣реА рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд▓рд┐рдВрдХ рдЧрд┐рдирддреА рдЗрдХрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рд╢реЗрд╖ рдЬрд╛рджреВ рдХреЗ рдмрд┐рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред
Std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд░реНрдд :: enable_sared_from_this рд╢реБрд░реВ рдореЗрдВ std рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ :: рд╕рд╛рдЭрд╛_рдкреНрд░рддрд┐ред рд╕реНрдЯреИрдХ рдкрд░ рдмрдирд╛рдирд╛, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдвреЗрд░ рдкрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛, рдПрд╕рдЯреАрдбреА рдкрд░ рдмрдирд╛рдирд╛ :: unique_ptr - рдпрд╣ рд╕рдм рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдХреЗрд╡рд▓ std рдореЗрдВ рд╕рдЦреНрддреА рд╕реЗ :: share_ptrред
рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?
рд╣рд╛рдБ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕:
- рдореВрд▓ рд░реВрдк рд╕реЗ std рдореЗрдВ рд░рдЦрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдзрд┐ рдкреНрд░рджрд╛рди рдХрд░реЗрдВ :: рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛;
- рдирд┐рдЬреА рдпрд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдореЗрдВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдбрд╛рд▓реЗрдВ;
- рдкреНрд░рддрд┐-рдкреНрд░рддрд┐рдмрдВрдз рдФрд░ рдЪрд╛рд▓-рд╢рдмреНрджрд╛рд░реНрдеред
рд╡рд░реНрдЧ рдкрд┐рдВрдЬрд░реЗ рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛, рдЗрд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдЪрд╛рдмреА рдирд┐рдЧрд▓ рд▓реА - рдЕрдм рд╕реЗ рдЗрд╕рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рдХреЗрд╡рд▓ std рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ: рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╣рд╛рдВ рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рдиреВрдиреА рддрд░реАрдХреЗ рдирд╣реАрдВ рд╣реИрдВред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд╛рд╕реНрддреБ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдзрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рддреА рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк PIMPL рдореБрд╣рд╛рд╡рд░реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдордХрд░ рд╡рд░реНрдЧ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ - рдореБрдЦреМрдЯрд╛ - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдЦреНрддреА рд╕реЗ std :: shared_ptr рдореЗрдВ рдмрдирд╛рдПрдЧрд╛, рдФрд░ рдореБрдЦреМрдЯрд╛ рд╕реНрд╡рдпрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рд╕реЗ рд╡рдВрдЪрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
std :: enable_sared_from_this рдХреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред
рдмрд┐рдВрджреБ рдкрд░ рдкрд╣реБрдВрдЪреЗрдВ
рд▓реЗрдЦ рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рднреА рдХреЛрдб рдЙрджрд╛рд╣рд░рдг
рдЬреАрдердм рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред
рдХреЛрдб рдЖрдзреБрдирд┐рдХ C ++ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдЪреНрдЫрдиреНрди рдмреБрд░реА рддрдХрдиреАрдХреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
SimpleCyclic
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рд╕рд░рд▓ рдФрд░ рд╕реАрдзреА рд▓рдЧрддреА рд╣реИред рдПрдХ "рдЫреЛрдЯреЗ" рд╡рд┐рд╡рд░рдг рдХреЛ рдЫреЛрдбрд╝рдХрд░ - рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ std рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд :: enable_sared_from_this рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
SimpleCyclic.h#pragma once #include <memory> #include <functional> namespace SimpleCyclic { class Cyclic final : public std::enable_shared_from_this<Cyclic> { public: static std::shared_ptr<Cyclic> create(); Cyclic(const Cyclic&) = delete; Cyclic(Cyclic&&) = delete; Cyclic& operator=(const Cyclic&) = delete; Cyclic& operator=(Cyclic&&) = delete; ~Cyclic(); void doSomething(); private: Cyclic(); std::function<void(void)> _fn; }; } // namespace SimpleCyclic
рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ:
SimpleCyclic.cpp #include <iostream> #include "SimpleCyclic.h" namespace SimpleCyclic { Cyclic::Cyclic() = default; Cyclic::~Cyclic() { std::cout << typeid(*this).name() << "::" << __func__ << std::endl; } std::shared_ptr<Cyclic> Cyclic::create() { return std::shared_ptr<Cyclic>(new Cyclic); } void Cyclic::doSomething() { _fn = [shis = shared_from_this()](){}; std::cout << typeid(*this).name() << "::" << __func__ << std::endl; } } // namespace SimpleCyclic
main.cpp #include "SimpleCyclic/SimpleCyclic.h" int main() { auto simpleCyclic = SimpleCyclic::Cyclic::create(); simpleCyclic->doSomething(); return 0; }
рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯN12SimpleCyclic6CyclicE :: doSomething
DoSomething () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ, рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг
рд╕реНрд╡рдпрдВ std рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдордЬрдмреВрдд рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдЧрд╛ :: share_ptr рдЬрд┐рд╕рдореЗрдВ рдЗрд╕реЗ рд░рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд┐рд░, рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХреИрдкреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреЛ рдПрдХ рд╣рд╛рдиреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдПрд╕рдЯреА :: рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрдбрд╝ рдореЗрдВ рд╡рд░реНрдЧ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕реМрдВрдкрд╛ рдЬрд╛рддрд╛ рд╣реИред DoSomething () рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдПрдХ рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реИ, рдФрд░ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рдЕрдм рд╕рднреА рдЕрдиреНрдп рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд▓рд┐рдВрдХ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЗ рдмрд╛рдж рднреА рдирд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рд╣реИред рд╕рд┐рдореНрдкрд▓рд╕рд╛рдЗрдХреНрд▓рд┐рдХ :: рдЪрдХреНрд░реАрдп :: ~ рдЪрдХреНрд░реАрдп рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг "рд░рдЦрддрд╛ рд╣реИ" рдЦреБрджред
рдХреЛрдб рдПрдХ рдЧрд╛рдБрда рдореЗрдВ рдлрдВрд╕ рдЧрдпрд╛ред
(
рдпрд╣рд╛рдВ рд╕реЗ рд▓реА рдЧрдИ рдЫрд╡рд┐)
рдФрд░ рдХреНрдпрд╛, рдпрд╣ "рдЬрд╝реЛрдВрдмреА" рдПрдВрдЯреАрдкреИрдЯрд░реНрди рд╣реИ?рдирд╣реАрдВ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдХрд╕рд░рдд рд╣реИред рд╕рднреА рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдЕрднреА рддрдХ рдЖрдирд╛ рдмрд╛рдХреА рд╣реИред
рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдпрд╣ рдХреНрдпреЛрдВ рд▓рд┐рдЦрд╛?рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЙрджрд╛рд╣рд░рдгред рдореБрдЭреЗ рдРрд╕реА рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдРрд╕рд╛ рдХреЛрдб рд╕рд╛рдордВрдЬрд╕реНрдпрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рддреЛ, рдХреНрдпрд╛ рдЧрддрд┐рд╢реАрд▓ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЪреБрдк рд░рд╣рд╛?рдирд╣реАрдВ, Valgrind рдиреЗ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдХреА рд╕реВрдЪрдирд╛ рджреА:
рдкреЛрд╕реНрдЯ рд╡реЗрд▓рдЧреНрд░рд┐рдВрдб1 рдмреНрд▓реЙрдХ рдореЗрдВ 96 (64 рдкреНрд░рддреНрдпрдХреНрд╖, 32 рдЕрдкреНрд░рддреНрдпрдХреНрд╖) рдмрд╛рдЗрдЯреНрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 46 рдХреЗ рдиреБрдХрд╕рд╛рди рд░рд┐рдХреЙрд░реНрдб 29 рдореЗрдВ рдЦреЛ рдЧрдП рд╣реИрдВ
SimpleCyclic рдореЗрдВ :: Cyclic :: create (in /User/User/Projects/Zomby_antipattern_concept/SimpleCyclic/SimpleCyclic.cpp:15
1: /ocr/local/Cellar/valgrind/HEAD-60ab74a/lib/valgrind/vgpreload_memcheck-amd64-darwin.so рдореЗрдВ рдореЙрд▓реЙрдХ
2: рдСрдкрд░реЗрдЯрд░ рдирдпрд╛ (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмрд╛) /usr/lib/libc++abi.dylib рдореЗрдВ
3: рд╕рд░рд▓ рдЪрдХреНрд░реАрдп :: рдЪрдХреНрд░реАрдп :: рд╕реГрдЬрд┐рдд рдХрд░реЗрдВ (рдореЗрдВ) /User/User/Projects/Zomby_antipattern_concept/SimpleCyclic/SimpleCyclic.cpp:15
4: рдореБрдЦреНрдп рдореЗрдВ /User/User/Projects/Zomby_antipattern_concept/SimpleCyclic/main.cpppes
PimplCyclic
рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реА рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд▓рдЧрддреА рд╣реИред рдЗрд╕рдиреЗ рдПрдХ рдРрд╕рд╛ рдкрд╣рд▓реВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬреЛ std :: shared_ptr рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо - рдЬрд┐рд╕рдореЗрдВ std :: enable_sared_from_this рд╢рд╛рдорд┐рд▓ рд╣реИ - рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╡рд┐рдкрд░реАрдд рдЧрд╛рдпрдм рд╣реИред
PimplCyclic.h #pragma once #include <memory> namespace PimplCyclic { class Cyclic { public: Cyclic(); ~Cyclic(); private: class Impl; std::shared_ptr<Impl> _impl; }; } // namespace PimplCyclic
рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ:
PimplCyclic.cpp #include <iostream> #include <functional> #include "PimplCyclic.h" namespace PimplCyclic { class Cyclic::Impl : public std::enable_shared_from_this<Cyclic::Impl> { public: ~Impl() { std::cout << typeid(*this).name() << "::" << __func__ << std::endl; } void doSomething() { _fn = [shis = shared_from_this()](){}; std::cout << typeid(*this).name() << "::" << __func__ << std::endl; } private: std::function<void(void)> _fn; }; Cyclic::Cyclic() : _impl(std::make_shared<Impl>()) { if (_impl) { _impl->doSomething(); } } Cyclic::~Cyclic() { std::cout << typeid(*this).name() << "::" << __func__ << std::endl; } } // namespace PimplCyclic
main.cpp #include "PimplCyclic/PimplCyclic.h" int main() { auto pimplCyclic = PimplCyclic::Cyclic(); return 0; }
рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯN11PimplCyclic6Cyclic4ImplE :: doSething
N11PimplCyclic6CyclicE :: ~ рдЪрдХреНрд░реАрдп
Impl :: doSomething () рдХреЙрд▓рд┐рдВрдЧ Impl рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реИред рдореБрдЦреМрдЯрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓реАрдХ рд╣реЛ рд░рд╣рд╛ рд╣реИред рд╡рд┐рдзреНрд╡рдВрд╕рдХ PimplCyclic :: рдЪрдХреНрд░реАрдп :: Impl :: ~ Impl рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдлрд┐рд░ рд╕реЗ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рдФрд░ рдЕрдзрд┐рдХ рдЦрддрд░рдирд╛рдХ рд╣реИ - рд╕рднреА рдЦрд░рд╛рдм рдЙрдкрдХрд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВ рдФрд░ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдореЗрдВ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдкрд░рд┐рдкрддреНрд░ рд▓рд┐рдВрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдХреЛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред
Valgrind рдХреЗ рдЪреЗрд╣рд░реЗ рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг, рдФрд░ рдЗрд╕ рдмрд╛рд░ рдПрдХ рд▓реАрдХ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛:
рдкреЛрд╕реНрдЯ рд╡реЗрд▓рдЧреНрд░рд┐рдВрдб1 рдмреНрд▓реЙрдХ рдореЗрдВ 96 рдмрд╛рдЗрдЯреНрд╕ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ 46 рдХреЗ рдиреБрдХрд╕рд╛рди рд░рд┐рдХреЙрд░реНрдб 29 рдореЗрдВ рдЦреЛ рдЧрдП рд╣реИрдВ
PimplCyclic рдореЗрдВ :: рдЪрдХреНрд░реАрдп :: Cyclic () in /User/User/Projects/Zomby_antipattern_concept/PimplCyclic/PimplCyclic.cpp.28
1: /ocr/local/Cellar/valgrind/HEAD-60ab74a/lib/valgrind/vgpreload_memcheck-amd64-darwin.so рдореЗрдВ рдореЙрд▓реЙрдХ
2: рдСрдкрд░реЗрдЯрд░ рдирдпрд╛ (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмрд╛) /usr/lib/libc++abi.dylib рдореЗрдВ
3: std :: __ 1 :: __ libcpp_allocate (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмрд╛, рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмрд╛) /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault/xctoolchain/usr/include/c+/v1/new:252 рдореЗрдВ
4: std :: __ 1 :: рдПрд▓реЛрдХреЗрдЯрд░ <std :: __ 1 :: __ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛_рдкреНрд░реА_рдкреНрд▓реЗрд╕ <рдкрд┐рдореНрдкрд▓рд╕рд╛рдЗрдХрд┐рдХ :: рдЪрдХреНрд░реАрдп :: рдЗрдореНрдкреНрд▓рд╛рдВрдЯ, рдПрд╕рдЯреАрдбреА :: __ 1 :: рдПрд▓реЛрдХреЗрдЯрд░ <рдкрд┐рдореНрдкрд▓рд┐рд╕рд╛рдЗрдХ :: рдЪрдХреНрд░реАрдп :: рдЗрдореНрдкреНрд▓рд╛рдВрдЯ >>> рдЖрд╡рдВрдЯрд┐рдд (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА) , void const *) in /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c+/v1/ememory:1813
5: std :: __ 1 :: share_ptr <PimplCyclic :: Cyclic :: Impl> std :: __ 1 :: рд╕рд╛рдЭрд╛_рдкреНрд░рд╛ <pimplCyclic :: рдЪрдХреНрд░реАрдп :: Impl> :: make -sared <> () in /Applications/Xcode.app/Contents /Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:4326
6: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:4706 рдореЗрдВ _ZNSt3__1L11make_sharedIN11PimplCyclic6Cyclic4ImplEJEEENS_9enable_ifIXntsr8is_arrayIT_EE5valueENS_10shared_ptrIS5_EEE4typeEDpOT0_
7: PimplCyclic :: рдЪрдХреНрд░реАрдп :: Cyclic () in /User/User/Projects/Zomby_antipattern_concept/PimplCyclic/PimplCyclic.cpp.28
8: PimplCyclic :: рдЪрдХреНрд░реАрдп :: Cyclic () in /User/User/Projects/Zomby_antipattern_concept/PimplCyclic/PimplCyclic.cpp.29
9: рдореЗрди рдЗрди / рдпреВрдЬрд░реНрд╕ / рдпреВрдЬрд╝рд░ /рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ / рдЬрд╝реЛрдореНрдмреА_рдЗрдВрдЯрд░рд┐рдкреЛрд░реНрдЯреЗрди_рдХреИрдкреНрд╕ / рдкрд┐рдореНрдкрд▓рд╕рд╛рдЗрдХрд▓ / рдореЗрди.рдХреИрдкреНрд╕
Pimpl рдХреЛ рджреЗрдЦрдирд╛ рдереЛрдбрд╝рд╛ рд╕рдВрджрд┐рдЧреНрдз рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ std :: share_ptr рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрдХреНрд▓рд╛рд╕рд┐рдХ рд░реЙ рдкреЙрдЗрдВрдЯрд░-рдЖрдзрд╛рд░рд┐рдд рдкрд┐рдореНрдкрд▓ рдмрд╣реБрдд рдкреБрд░рд╛рддрди рд╣реИ, рдФрд░ std :: unique_ptr рдХреЗ рдкрд╛рд╕ рдкреНрд░рддрд┐-рд╢рдмреНрджрд╛рд░реНрде рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдХреЛ рдлреИрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХрд╛ рдПрдХ рдкрд╣рд▓реВ рдПрдХрдорд╛рддреНрд░ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдХреЗ рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛, рдЬреЛ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП std :: share_ptr рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЧ рдХреЛ рд╕рд╛рдЭрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рдХреНрд▓рд╛рд╕рд┐рдХ рд▓реАрдХ рд╕реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ - рдмрд╛рдж рдореЗрдВ рд╣рдЯрд╛рдП рдмрд┐рдирд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирдИ рдХреЙрд▓ рдХрд░рдХреЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдирд╛? рдЙрд╕реА рддрд░рд╣, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╕реБрдВрджрд░ рд╣реЛрдЧрд╛, рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ - рдПрдХ рдмрдЧредрд╣рдо рдкреИрд░ рдореЗрдВ рдЦреБрдж рдХреЛ рдЧреЛрд▓реА рдорд╛рд░рдиреЗ рдХреЗ
рдЖрдзреБрдирд┐рдХ рддрд░реАрдХреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдПрдВрдЯреАрдкреИрдЯрд░реНрди "рд▓рд╛рд╢"
рддреЛ, рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рдордЧреНрд░реА рд╕реЗ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ:
- рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдиреЛрдбреНрд╕ рдореЗрдВ рдмрд╛рдВрдзрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
- std рдХрд╛ рдЙрдкрдпреЛрдЧ :: enable_sared_from_this рдЗрд╕ рдореЗрдВ рдпреЛрдЧрджрд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рдЧрднрдЧ рдмрд╛рд╣рд░ рдХреА рдорджрдж рд╕реЗ рдиреЛрдб рдореЗрдВ рдмрд╛рдБрдзрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдФрд░ рдЕрдм - рдзреНрдпрд╛рди - рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ? рдХреНрдпрд╛ RAII рдлрд╝рд╛рдЗрд▓ рджреЗрдЦрднрд╛рд▓ рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ HTTPS рдХрдиреЗрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╣реИ?SimpleZomby
рдХреЙрдорди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрд╛рдж рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдо рдХреЛрдб рдХреЛ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдорд╛рдореВрд▓реА рдирд╛рдо рдкреНрд░рдмрдВрдзрдХ рдХреЗ рд╕рд╛рде рд╕рд╛рд░ рдЬрд╝реЛрдВрдмреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕:
рдЖрдо / рдкреНрд░рдмрдВрдзрдХ #pragma once #include <memory> namespace Common { class Listener; class Manager { public: Manager() = default; Manager(const Manager&) = delete; Manager(Manager&&) = delete; Manager& operator=(const Manager&) = delete; Manager& operator=(Manager&&) = delete; virtual ~Manager() = default; virtual void runOnce(std::shared_ptr<Common::Listener> listener) = 0; }; } // namespace Common
рд╢реНрд░реЛрддрд╛ рдХрд╛ рд╕рд╛рд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдзрд╛рдЧрд╛-рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╛рда рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░:
рдЖрдо / рд╢реНрд░реЛрддрд╛.рд╣ #pragma once #include <string> #include <memory> namespace Common { class Listener { public: virtual ~Listener() = default; using Data = std::string; // thread-safe virtual void processData(const std::shared_ptr<const Data> data) = 0; }; } // namespace Common
рд╢реНрд░реЛрддрд╛ рдЬреЛ рд╕рд╛рдВрддреНрд╡рдирд╛ рдХреЗ рд▓рд┐рдП рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рд┐рдВрдЧреНрдирд▓рдЯрди рдХреЛ рдЕрдкрдиреЗ рд▓реЗрдЦ
рддрдХрдиреАрдХ рд╕реЗ рдЕрдкреНрд░рднрд╛рд╡рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╡рдзрд╛рд░рдгрд╛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ
рдЬрдм рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ :
рдХреЙрдорди / рдЗрдВрдкреНрд▓рд╛рдВрдЯ / рд░рд╛рдЗрдЯрдЯреЙрдХреЛрдиреЛрд╕реЛрд▓рд┐рд╕реНрдЯрдирд░.рд╣ #pragma once #include <mutex> #include "Common/Listener.h" namespace Common { class WriteToConsoleListener final : public Listener { public: WriteToConsoleListener(const WriteToConsoleListener&) = delete; WriteToConsoleListener(WriteToConsoleListener&&) = delete; WriteToConsoleListener& operator=(const WriteToConsoleListener&) = delete; WriteToConsoleListener& operator=(WriteToConsoleListener&&) = delete; ~WriteToConsoleListener() override; static std::shared_ptr<WriteToConsoleListener> instance(); // blocking void processData(const std::shared_ptr<const Data> data) override; private: WriteToConsoleListener(); std::mutex _mutex; }; } // namespace Common
рд╕рд╛рдорд╛рдиреНрдп / Impl / WriteToConsoleListener.cpp #include <iostream> #include "WriteToConsoleListener.h" namespace Common { WriteToConsoleListener::WriteToConsoleListener() = default; WriteToConsoleListener::~WriteToConsoleListener() { auto lock = std::lock_guard(_mutex); std::cout << typeid(*this).name() << "::" << __func__ << std::endl; } std::shared_ptr<WriteToConsoleListener> WriteToConsoleListener::instance() { static auto inst = std::shared_ptr<WriteToConsoleListener>(new WriteToConsoleListener); return inst; } void WriteToConsoleListener::processData(const std::shared_ptr<const Data> data) { if (data) { auto lock = std::lock_guard(_mutex); std::cout << *data << std::flush; } } } // namespace Common
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкрд╣рд▓реА рдЬрд╝реЛрдВрдмреА, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ред
SimpleZomby.h #pragma once #include <memory> #include <atomic> #include <thread> #include "Common/Manager.h" namespace Common { class Listener; } // namespace Common namespace SimpleZomby { class Zomby final : public Common::Manager, public std::enable_shared_from_this<Zomby> { public: static std::shared_ptr<Zomby> create(); ~Zomby() override; void runOnce(std::shared_ptr<Common::Listener> listener) override; private: Zomby(); using Semaphore = std::atomic<bool>; std::shared_ptr<Common::Listener> _listener; Semaphore _semaphore = false; std::thread _thread; }; } // namespace SimpleZomby
SimpleZomby.cpp #include <sstream> #include "SimpleZomby.h" #include "Common/Listener.h" namespace SimpleZomby { std::shared_ptr<Zomby> Zomby::create() { return std::shared_ptr<Zomby>(new Zomby()); } Zomby::Zomby() = default; Zomby::~Zomby() { _semaphore = false; if (_thread.joinable()) { _thread.detach(); } if (_listener) { std::ostringstream buf; buf << typeid(*this).name() << "::" << __func__ << std::endl; _listener->processData(std::make_shared<Common::Listener::Data>(buf.str())); } } void Zomby::runOnce(std::shared_ptr<Common::Listener> listener) { if (_semaphore) { throw std::runtime_error("SimpleZomby::Zomby::runOnce() called twice"); } _listener = listener; _semaphore = true; _thread = std::thread([shis = shared_from_this()](){ while (shis && shis->_listener && shis->_semaphore) { shis->_listener->processData(std::make_shared<Common::Listener::Data>("SimpleZomby is alive!\n")); std::this_thread::sleep_for(std::chrono::seconds(1)); } }); } } // namespace SimpleZomby
рдПрдХ рдЬрд╝реЛрдВрдмреА рдПрдХ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рд▓рдВрдмреЛ рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛рддрд╛ рд╣реИ, рд╕рдордп-рд╕рдордп рдкрд░ рд╢реНрд░реЛрддрд╛ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рднреЗрдЬрддрд╛ рд╣реИред рдХрд╛рдо рдХреЗ рд▓рд┐рдП рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕реЗрдорд╛рдлреЛрд░ рдФрд░ рд╢реНрд░реЛрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЬрд╝реЛрдВрдмреА рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░ рд╣реИрдВред рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝реАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрдкреНрдЪрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдЧреНрд░реАрдЧреЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдореЗрдордиреЗ рдХреЗ рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╝реЛрдВрдмреА рд╡рд░реНрдЧ рдХреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрдЧрд╛ред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд▓реИрдореНрдмреНрдбрд╛ рдлрдВрдХреНрд╢рди рд╢реЗрдпрд░реНрдб_рдлреНрд░реЛрдо_рдерд┐рд╕ () рдХреА рдПрдХ рдордЬрдмреВрдд рдХреЙрдкреА рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИред
рдЬрд╝реЛрдВрдмреА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ, рд╕реЗрдорд╛рдлреЛрд░ рдХреЛ рдЭреВрдард╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ () рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реЗрдорд╛рдлреЛрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдзрд╛рдЧреЗ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред
рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ, рдбрд┐рдЯреИрдЪ () рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЬреНрд╡рд╛рдЗрди () рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛!... рдФрд░ рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рддреЛ рдпрд╣ RAII рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реИ! рд╕рдВрд╕рд╛рдзрди рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА RAII рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛!рдпрджрд┐ рд╕рдЦреНрддреА рд╕реЗ - рддреЛ рд╣рд╛рдВ, рдЬрд╝реЛрдВрдмреА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рд╕рдВрд╕рд╛рдзрди рдЬрд╛рд░реА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓
рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рд░рд┐рд▓реАрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЙрддреНрдкрд╛рджрд┐рдд - рд╢рд╛рдпрдж рдЬрд▓реНрдж рд╣реА, рдпрд╛ рд╢рд╛рдпрдж рдирд╣реАрдВред рдФрд░ рдпрд╣ рднреА рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдкрд╣рд▓реЗ рдХрд╛рдо рдЦрддреНрдо рдХрд░ рджреЗрдЧрд╛ - рдлрд┐рд░ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдереНрд░реЗрдб рдХреЛ рдЬрдмрд░рди рд╕рд╛рдл тАЛтАЛрдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, "рд╕рд╣реА" рдФрд░ "рдЧрд▓рдд" RAII рдХреЗ рдмреАрдЪ рдХреА рд░реЗрдЦрд╛ рдмрд╣реБрдд рдкрддрд▓реА рд╣реЛ рд╕рдХрддреА рд╣реИ: рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рд╕рд╣реА" RAII, рдЬреЛ std :: filesystem :: remove () рдХреЛ рдПрдХ рдЕрд╕реНрдерд╛рдпреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣рддреА рд╣реИ, рдЗрд╕рд╕реЗ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рдЖ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рдХреНрд╖рдг рдЬрдм рд▓реЗрдЦрди рдХрдорд╛рдВрдб рдЕрднреА рднреА рдХрд┐рд╕реА рднреА рдЕрд╕реНрдерд┐рд░ рдХреИрд╢ рдореЗрдВ рд╣реЛрдЧреА рдФрд░ рд╣рд╛рд░реНрдб рдбрд┐рд╕реНрдХ рдХреЗ рдЪреБрдВрдмрдХреАрдп рдкреНрд▓реЗрдЯ рдкрд░ рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦреА рдЬрд╛рдПрдЧреАред
main.cpp #include <chrono> #include <thread> #include <sstream> #include "Common/Impl/WriteToConsoleListener.h" #include "SimpleZomby/SimpleZomby.h" int main() { auto writeToConsoleListener = Common::WriteToConsoleListener::instance(); { auto simpleZomby = SimpleZomby::Zomby::create(); simpleZomby->runOnce(writeToConsoleListener); std::this_thread::sleep_for(std::chrono::milliseconds(4500)); } // Zomby should be killed here { std::ostringstream buf; buf << "============================================================\n" << "| Zomby was killed |\n" << "============================================================\n"; if (writeToConsoleListener) { writeToConsoleListener->processData(std::make_shared<Common::Listener::Data>(buf.str())); } } std::this_thread::sleep_for(std::chrono::milliseconds(5000)); return 0; }
рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯSimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
SimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
SimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
SimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
SimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
================================================== ==========
| рдЬрд╝реЛрдореНрдмреА рдХреЛ рдорд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ |
================================================== ==========
SimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
SimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
SimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
SimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
SimpleZomby рдЬреАрд╡рд┐рдд рд╣реИ!
рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рд╕реЗ рдХреНрдпрд╛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
- рдЧреБрдВрдЬрд╛рдЗрд╢ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЬрд╝реЛрдВрдмреА рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛;
- рдХрд┐рд╕реА рднреА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдпрд╛ рддреЛ рд▓рд╛рд╢ рдпрд╛ рд▓рд┐рдЦреЛрдХреЛрдиреЛрд╕реЛрд▓рд┐рд╕реНрдЯрдирд░ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ред
рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рд╣реБрдЖ рд╣реИред
рд░рд┐рд╕реЛрд░реНрд╕ рд▓реАрдХ рд╣реБрдЖ рдерд╛ред рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдзрд╛рдЧрд╛ рд╣реИред
рдЬрд┐рд╕ рдХреЛрдб рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛, рд╡рд╣ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд░рд╣рд╛ред
рдПрдХ WriteToConsoleListener рд░рд┐рд╕рд╛рд╡ рдХреЛ рдЕрдкрдиреЗ рд▓реЗрдЦ
рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЧреНрд▓рдЯрдирд╡реЗрдХ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛
рдЬрдм рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдмрдЪреЗрдВ , рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

(
рдпрд╣рд╛рдВ рд╕реЗ рд▓реА рдЧрдИ рдЫрд╡рд┐)
рдХреНрдпреЛрдВ рд▓рд╛рд╢?рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдорд╛рд░рд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рд╡рд╣ рдЕрднреА рднреА рдЬреАрд╡рд┐рдд рд╣реИред
рдпрд╣ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрднреЛрдВ рд╕реЗ рдХреИрд╕реЗ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИ?рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдПрдХ рдЦреЛ рд╕рдВрд╕рд╛рдзрди рдХреЗрд╡рд▓ рд╕реНрдореГрддрд┐ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдзрд╛рдЧреЗ рдХреЗ рдХреЛрдб рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХреНрдпрд╛ "рд▓рд╛рд╢" рдХреЛ рдирд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?рдЧреБрдВрдЬрд╛рдЗрд╢ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж (рдпрд╛рдиреА, рд▓рд╛рд╢ рдХреЛ рд╕рднреА рдмрд╛рд╣рд░реА рдордЬрдмреВрдд рдФрд░ рдХрдордЬреЛрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж) - рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИред рдПрдХ рдЬрд╝реЛрдВрдмреА рддрдм рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рд╡рд╣ рдЦреБрдж рдХреЛ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд░рддрд╛ рд╣реИ (рд╣рд╛рдБ, рдпрд╣ рд╕рдХреНрд░рд┐рдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╣реИ), рд╢рд╛рдпрдж рдХрднреА рдирд╣реАрдВ, рдЕрд░реНрдерд╛рддреНред рдЬрдм рддрдХ рдЖрд╡реЗрджрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рддрдХ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕рд╛рдл рд╣реЛрдиреЗ рддрдХ рдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧрд╛ред рдмреЗрд╢рдХ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдЬрд╝реЛрдВрдмреА рдХреЛрдб рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд┐рддрд┐ рдкрд░ рдХреБрдЫ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рднрд╛рд╡ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди-рдирд┐рд░реНрднрд░ рд╣реЛрдЧрд╛ред
рдФрд░ рд╕реНрдХреЛрдк рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ?рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╝реЛрдВрдмреА рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдмреБрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░-рдмрд╛рд░ рдирд╖реНрдЯ рд╣реЛрдиреЗ рдХреЗ рдХрд╛рд░рдг рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдЖрд░рдПрдЖрдИ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдбрд╝рд╛рдИ рд╣реИред рдпрд╛ рдЖрдк рд╕реНрдкрд╖реНрдЯ рдбреА-рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ - рдФрд░ рдпрд╣ рдЖрд░рдПрдЖрдИ рдХреА рдЕрд╕реНрд╡реАрдХреГрддрд┐ рд╣реИред
рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдереНрд░реЗрдб рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдЕрд▓рдЧ рдХреИрд╕реЗ рд╣реИ ()?рд▓рд╛рд╢ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЙрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд (), рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдХреЗрд╡рд▓ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реЛрдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред
рдХреНрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЕрднреА рднреА рд╕рд┐рдВрдереЗрдЯрд┐рдХ рд╣реИ?рднрд╛рдЧ рдореЗрдВред рдЗрд╕ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, share_from_this () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдХрд╛рд░рдг рдирд╣реАрдВ рдерд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрдордЬреЛрд░_рдлреНрд░реЗрдо_рдерд┐рд╕ () рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдпрд╛ рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдлрд╝реАрд▓реНрдб рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд░ рд╕рдХрддреЗ рдереЗред рд▓реЗрдХрд┐рди рдЬрдм рдХрд╛рд░реНрдп рдЬрдЯрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдВрддреБрд▓рди рдкрдХреНрд╖ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ
share_from_this ()ред
рд╡рд╛рд▓реНрдЧреНрд░рд┐рдВрдб, рд╡реИрд▓реНрдЧреНрд░рд┐рдВрдб! рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд▓рд╛рд╢ рдХреЗ рдЦрд┐рд▓рд╛рдл рд░рдХреНрд╖рд╛ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реЗрдЦрд╛ рд╣реИ!рдХрд╛рд╢ рдФрд░ рдЖрд╣ - рд▓реЗрдХрд┐рди Valgrind рдПрдХ рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдкреНрд░рдХрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдХреНрдпреЛрдВ - рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ред рдбрд╛рдпрдЧреНрдиреЛрд╕реНрдЯрд┐рдХреНрд╕ рдореЗрдВ, рдХреЗрд╡рд▓
"рд╕рдВрднрд╡рддрдГ рдЦреЛ рдЧрдП" рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╣реИрдВ рдЬреЛ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреА рд╣реИрдВ - рдПрдХ рд╣реА рд░рд╛рд╢рд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░ рдПрдХ рд╣реА рд░рд╛рд╢рд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрдм рдПрдХ рдЦрд╛рд▓реА рдореБрдЦреНрдп рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИрдВред рдЕрдиреНрдп рдЧрддрд┐рд╢реАрд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЕрднреА рднреА рдЙрди рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрдврд╝реЗрдВред
SteppingZomby
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ stepDnsName ---> ConnectTcp ---> installSsl ---> sendHttpRequest ---> readHttpReply, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ HTTPS рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╕реЗрдХрдВрдб рд▓рдЧрддрд╛ рд╣реИред
SteppingZomby.h #pragma once #include <memory> #include <atomic> #include <thread> #include "Common/Manager.h" namespace Common { class Listener; } // namespace Common namespace SteppingZomby { class Zomby final : public Common::Manager, public std::enable_shared_from_this<Zomby> { public: static std::shared_ptr<Zomby> create(); ~Zomby() override; void runOnce(std::shared_ptr<Common::Listener> listener) override; private: Zomby(); using Semaphore = std::atomic<bool>; std::shared_ptr<Common::Listener> _listener; Semaphore _semaphore = false; std::thread _thread; void resolveDnsName(); void connectTcp(); void establishSsl(); void sendHttpRequest(); void readHttpReply(); }; } // namespace SteppingZomby
SteppingZomby.cpp #include <sstream> #include <string> #include "SteppingZomby.h" #include "Common/Listener.h" namespace { void doSomething(Common::Listener& listener, std::string&& callingFunctionName) { listener.processData(std::make_shared<Common::Listener::Data>(callingFunctionName + " started\n")); std::this_thread::sleep_for(std::chrono::milliseconds(1000)); listener.processData(std::make_shared<Common::Listener::Data>(callingFunctionName + " finished\n")); } } // namespace namespace SteppingZomby { Zomby::Zomby() = default; std::shared_ptr<Zomby> Zomby::create() { return std::shared_ptr<Zomby>(new Zomby()); } Zomby::~Zomby() { _semaphore = false; if (_thread.joinable()) { _thread.detach(); } if (_listener) { std::ostringstream buf; buf << typeid(*this).name() << "::" << __func__ << std::endl; _listener->processData(std::make_shared<Common::Listener::Data>(buf.str())); } } void Zomby::runOnce(std::shared_ptr<Common::Listener> listener) { if (_semaphore) { throw std::runtime_error("SteppingZomby::Zomby::runOnce() called twice"); } _listener = listener; _semaphore = true; _thread = std::thread([shis = shared_from_this()](){ if (shis && shis->_listener && shis->_semaphore) { shis->resolveDnsName(); } if (shis && shis->_listener && shis->_semaphore) { shis->connectTcp(); } if (shis && shis->_listener && shis->_semaphore) { shis->establishSsl(); } if (shis && shis->_listener && shis->_semaphore) { shis->sendHttpRequest(); } if (shis && shis->_listener && shis->_semaphore) { shis->readHttpReply(); } }); } void Zomby::resolveDnsName() { doSomething(*_listener, std::string(typeid(*this).name()) + "::" + __func__); } void Zomby::connectTcp() { doSomething(*_listener, std::string(typeid(*this).name()) + "::" + __func__); } void Zomby::establishSsl() { doSomething(*_listener, std::string(typeid(*this).name()) + "::" + __func__); } void Zomby::sendHttpRequest() { doSomething(*_listener, std::string(typeid(*this).name()) + "::" + __func__); } void Zomby::readHttpReply() { doSomething(*_listener, std::string(typeid(*this).name()) + "::" + __func__); } } // namespace SteppingZomby
main.cpp #include <chrono> #include <thread> #include <sstream> #include "SteppingZomby/SteppingZomby.h" #include "Common/Impl/WriteToConsoleListener.h" int main() { auto writeToConsoleListener = Common::WriteToConsoleListener::instance(); { auto steppingZomby = SteppingZomby::Zomby::create(); steppingZomby->runOnce(writeToConsoleListener); std::this_thread::sleep_for(std::chrono::milliseconds(1500)); } // Zombies should be killed here { std::ostringstream buf; buf << "============================================================\n" << "| Zomby was killed |\n" << "============================================================\n"; if (writeToConsoleListener) { writeToConsoleListener->processData(std::make_shared<Common::Listener::Data>(buf.str())); } } std::this_thread::sleep_for(std::chrono::milliseconds(5000)); return 0; }
рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯN13SteppingZomby5ZombyE :: resolutionDnsName рд╢реБрд░реВ рд╣реБрдЖ
N13SteppingZomby5ZombyE :: solutionDnsName рд╕рдорд╛рдкреНрдд рд╣реБрдЖ
N13SteppingZomby5ZombyE :: connectTcp рдХреА рд╢реБрд░реБрдЖрдд рд╣реБрдИ
================================================== ==========
| рдЬрд╝реЛрдореНрдмреА рдХреЛ рдорд╛рд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ |
================================================== ==========
N13SteppingZomby5ZombyE :: connectTcp рд╕рдорд╛рдкреНрдд
N13SteppingZomby5ZombyE :: installSsl рд╢реБрд░реВ рд╣реБрдЖ
N13SteppingZomby5ZombyE :: installSsl рд╕рдорд╛рдкреНрдд
N13SteppingZomby5ZombyE :: sendHttpRequest рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЧрдпрд╛
N13SteppingZomby5ZombyE :: sendHttpRequest рд╕рдорд╛рдкреНрдд рд╣реБрдЖ
N13SteppingZomby5ZombyE :: readHttpReply рд╢реБрд░реВ рдХрд┐рдпрд╛
N13SteppingZomby5ZombyE :: readHttpReply рд╕рдорд╛рдкреНрдд
N13SteppingZomby5ZombyE :: ~ рдЬрд╝реЛрдордмреА
N6Common22WriteToConsoleListenerE :: ~ WriteToConsoleListener
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд░рдирдСрдирд╕реЗ () рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдПрдХ рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрдн рдХрд╛ рдиреЗрддреГрддреНрд╡ рдХрд┐рдпрд╛ред
рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░, Zomby рдФрд░ WriteToConsoleListener рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╣рд▓рд╛рдПред рдЖрд╡реЗрджрди рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рддрдХ рд╕рднреА рд╕рдВрд╕рд╛рдзрди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдереЗред рд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рдирд╣реАрдВ рд╣реБрдЖред
рдлрд┐рд░ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ?рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЬрд╝реЛрдВрдмреА рдмрд╣реБрдд рд▓рдВрдмрд╛ рд░рд╣рддрд╛ рдерд╛ - рд╕рднреА рдмрд╛рд╣рд░реА рдордЬрдмреВрдд рдФрд░ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреЗ рд╡рд┐рдирд╛рд╢ рдХреЗ рд▓рдЧрднрдЧ рд╕рд╛рдврд╝реЗ рддреАрди рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рджред рд▓рдЧрднрдЧ рддреАрди рд╕реЗрдХрдВрдб рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╡рд╣ рд░рд╣рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред рдФрд░ рдпрд╣ рд╕рдм рд╕рдордп рд╡рд╣ HTTPS рдХрдиреЗрдХреНрд╢рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рдерд╛ - рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдЗрд╕реЗ рдЕрдВрдд рддрдХ рдирд╣реАрдВ рд▓рд╛рдпрд╛ред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рдереАред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдмреЗрд╣рддрд░ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдиреЗ рд▓рд╛рд╢ рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред
рдЦреИрд░, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рдЖрдкрдХреЛ рд╡рд╣ рдЬрд╡рд╛рдм рдорд┐рд▓рд╛ рдЬрд┐рд╕рдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ ...редрдХреНрд▓рд╛рдЗрдВрдЯ HTTPS рдХрдиреЗрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ,
рд╣рдорд╛рд░реА рдУрд░ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:
- рдореЗрдореЛрд░реА рдХреА рдЦрдкрдд;
- рд╕реАрдкреАрдпреВ рдХреА рдЦрдкрдд;
- рдЯреАрд╕реАрдкреА рдкреЛрд░реНрдЯ рдХреА рдЦрдкрдд;
- рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рдХреА рдмреИрдВрдбрд╡рд┐рдбреНрде (рдЕрдиреБрд░реЛрдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЛрдиреЛрдВ рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рдореЗрдВ рдПрдХ рдорд╛рддреНрд░рд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ);
- рдЕрдирдкреЗрдХреНрд╖рд┐рдд рдбреЗрдЯрд╛ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ - рдЧрд▓рдд рдирд┐рд╖реНрдкрд╛рджрди рд╢рд╛рдЦрд╛ рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдпрд╛ рдЕрдкреБрд╖реНрдЯ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рддрдВрддреНрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░
рджреВрд░рд╕реНрде рдкрдХреНрд╖ рдкрд░ (рдордд рднреВрд▓реЛ - HTTPS рдЕрдиреБрд░реЛрдз рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рдерд╛) - рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рдорд╛рди рдмрд░реНрдмрд╛рджреА, рдкреНрд▓рд╕ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ:
- рдПрдХ рдХреЙрд░реНрдкреЛрд░реЗрдЯ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреА рддрд╕реНрд╡реАрд░реЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛;
- рдЖрдкрдХреА рд░рд╕реЛрдИ рдореЗрдВ рдЕрдВрдбрд░рдлреНрд▓реЛрд░ рд╣реАрдЯрд┐рдВрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдирд╛;
- рдПрдХреНрд╕рдЪреЗрдВрдЬ рдкрд░ рдПрдХ рд╡реНрдпрд╛рдкрд╛рд░ рдЖрджреЗрд╢ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди;
- рдЖрдкрдХреЗ рдЦрд╛рддреЗ рд╕реЗ рдзрди рдЕрдВрддрд░рдг;
- рдПрдХ рдЕрдВрддрд░рдорд╣рд╛рджреНрд╡реАрдкреАрдп рдмреИрд▓рд┐рд╕реНрдЯрд┐рдХ рдорд┐рд╕рд╛рдЗрд▓ рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрдгред
рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдиреЗ рд╕рднреА рдордЬрдмреВрдд рдФрд░ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреЛ рд╣рдЯрд╛рдХрд░ рд▓рд╛рд╢ рдХреЛ рд░реЛрдХрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред HTTPS рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рдЧрддрд┐ рдХреЛ рд░реЛрдХрдирд╛
рдЪрд╛рд╣рд┐рдП рдерд╛ - рдпрд╣ рдмрд╣реБрдд рджреЗрд░ рдирд╣реАрдВ рд╣реБрдИ рдереА, рдЖрд╡реЗрджрди рд╕реНрддрд░ рдХрд╛ рдбреЗрдЯрд╛ рдЕрднреА рддрдХ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЧрдпрд╛ рдерд╛ред
рд▓реЗрдХрд┐рди рд▓рд╛рд╢ рдиреЗ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рд▓рд╛рд╢ рдХреА рдЬрдЧрд╣ рдирдИ рд╡рд╕реНрддреБрдПрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдирд╛рд▓реА рдХреЛ рдЧреБрдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рд╕рддрдд рдкреНрд░рдХреНрд░рд┐рдпрд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡реЗрдмрд╕реЛрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдмрд░реНрдмрд╛рджреА рдШрдВрдЯреЛрдВ рддрдХ рдЬрд╛рд░реА рд░рд╣ рд╕рдХрддреА рд╣реИ, рдФрд░ рдпрджрд┐ рдХрдиреЗрдХреНрд╢рди рдХрд╛рдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдСрдЯреЛ-рдкреБрди: рд╕рдВрдпреЛрдЬрди рддрдВрддреНрд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЖрдо рддреМрд░ рдкрд░ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡реЗрд▓рдЧреНрд░рд┐рдВрдб?рдХреЛрдИ рдореМрдХрд╛ рдирд╣реАрдВред рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЬрд╛рд░реА рдФрд░ рд╕рд╛рдл рд╣реЛ рдЧрдпрд╛ рд╣реИред рджреЗрд░ рдФрд░ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рд╕реЗ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣реАред
BoozdedZomby
рдпрд╣ рдЙрджрд╛рд╣рд░рдг Boozd :: azzio рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХрд╛ рдПрдХ рдкреНрд░рддреАрдХ рд╣реИ :: asioред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдирдХрд▓ рдмрд▓реНрдХрд┐ рдХрдЪреНрдЪреЗ рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ io_context :: async_read (рдореВрд▓ рдореЗрдВ, рдпрд╣ рдореБрдлрд╝реНрдд рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд╛рд░ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ), рдЬреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:- рд╕реНрдЯреНрд░реАрдо, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдбреЗрдЯрд╛ рдЖ рд╕рдХрддрд╛ рд╣реИ;- рдПрдХ рдмрдлрд░ рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдЬрдорд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;- рдПрдХ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдЬрд┐рд╕реЗ рдбреЗрдЯрд╛ рд░реАрдбрд┐рдВрдЧ рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛редIo_context :: async_read рдлрд╝рдВрдХреНрд╢рди рдХреЛ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрднреА рднреА рдХреЙрд▓рдмреИрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреНрдЮрд╛рдд рд╣реЛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рддреНрд░реБрдЯрд┐)ред рдПрдХ рдХреЙрд▓рдмреИрдХ рдХреЛ рдХреЗрд╡рд▓ рдЕрд╡рд░реБрджреНрдз рдлрд╝рдВрдХреНрд╢рди io_context :: run () рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдореВрд▓ рдореЗрдВ, рдбреЗрдЯрд╛ рддреИрдпрд╛рд░ рд╣реЛрддреЗ рд╣реА рдХреЙрд▓рдмреИрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ)редbuffer.h #pragma once #include <vector> namespace boozd::azzio { using buffer = std::vector<int>; } // namespace boozd::azzio
stream.h #pragma once #include <optional> namespace boozd::azzio { class stream { public: virtual ~stream() = default; virtual std::optional<int> read() = 0; }; } // namespace boozd::azzio
io_context.h #pragma once #include <functional> #include <optional> #include "buffer.h" namespace boozd::azzio { class stream; class io_context { public: ~io_context(); enum class error_code {no_error, good_error, bad_error, unknown_error, known_error, well_known_error}; using handler = std::function<void(error_code)>; // Start an asynchronous operation to read a certain amount of data from a stream. // This function is used to asynchronously read a certain number of bytes of data from a stream. // The function call always returns immediately. void async_read(stream& s, buffer& b, handler&& handler); // Run the io_context object's event processing loop. void run(); private: using pack = std::tuple<stream&, buffer&>; using pack_optional = std::optional<pack>; using handler_optional = std::optional<handler>; pack_optional _pack_optional; handler_optional _handler_optional; }; } // namespace boozd::azzio
io_context.cpp #include <iostream> #include <thread> #include <chrono> #include "io_context.h" #include "stream.h" namespace boozd::azzio { io_context::~io_context() { std::cout << typeid(*this).name() << "::" << __func__ << std::endl; } void io_context::async_read(stream& s, buffer& b, io_context::handler&& handler) { _pack_optional.emplace(s, b); _handler_optional.emplace(std::move(handler)); } void io_context::run() { if (_pack_optional && _handler_optional) { auto& [s, b] = *_pack_optional; using namespace std::chrono; auto start = steady_clock::now(); while (duration_cast<milliseconds>(steady_clock::now() - start).count() < 1000) { if (auto read = s.read()) b.emplace_back(*read); std::this_thread::sleep_for(milliseconds(100)); } (*_handler_optional)(error_code::no_error); } } } // namespace boozd::azzio
рдПрдХрдорд╛рддреНрд░ boozd :: azzio :: рд╕реНрдЯреНрд░реАрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдбреЗрдЯрд╛ рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИ:impl / random_stream.h #pragma once #include "boozd/azzio/stream.h" namespace boozd::azzio { class random_stream final : public stream { public: ~random_stream() override; std::optional<int> read() override; }; } // namespace boozd::azzio
impl / random_stream.cpp #include <iostream> #include "random_stream.h" namespace boozd::azzio { boozd::azzio::random_stream::~random_stream() { std::cout << typeid(*this).name() << "::" << __func__ << std::endl; } std::optional<int> random_stream::read() { if (!(rand() & 0x1)) return rand(); return std::nullopt; } } // namespace boozd::azzio
BoozdedZomby рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛рддрд╛ рд╣реИред рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди async_read () рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ boozd рдХреЗ рдЖрдВрддрд░рд┐рдХ рддрдВрддреНрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рджреЗрддрд╛ рд╣реИ :: рд░рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ azzio ()ред рдЙрд╕рдХреЗ рдмрд╛рдж, boozd :: azzio рдХреЗ рдЖрдВрддрд░рд┐рдХ рддрдВрддреНрд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рд╕рдордп рдмрдлрд░ рдФрд░ рд╕реНрдЯреНрд░реАрдо (рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд) рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд░реНрдЧ рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╡реИрдзрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд▓рдВрдмреЛ рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдЭрд╛_рдлреНрд░реЗрдо_рдерд┐рд╕ рдХреЛ рдХреИрдкреНрдЪрд░ рдХрд░рддрд╛ рд╣реИредBoozdedZomby.h #pragma once #include <memory> #include <atomic> #include <thread> #include "Common/Manager.h" #include "boozd/azzio/buffer.h" #include "boozd/azzio/io_context.h" #include "boozd/azzio/impl/random_stream.h" namespace Common { class Listener; } // namespace Common namespace BoozdedZomby { class Zomby final : public Common::Manager, public std::enable_shared_from_this<Zomby> { public: static std::shared_ptr<Zomby> create(); ~Zomby() override; void runOnce(std::shared_ptr<Common::Listener> listener) override; private: Zomby(); using Semaphore = std::atomic<bool>; Semaphore _semaphore = false; std::shared_ptr<Common::Listener> _listener; boozd::azzio::random_stream _stream; boozd::azzio::buffer _buffer; boozd::azzio::io_context _context; std::thread _thread; }; } // namespace BoozdedZomby
BoozdedZomby.cpp #include <iostream> #include <sstream> #include "boozd/azzio/impl/random_stream.h" #include "BoozdedZomby.h" #include "Common/Listener.h" namespace BoozdedZomby { Zomby::Zomby() = default; std::shared_ptr<Zomby> Zomby::create() { return std::shared_ptr<Zomby>(new Zomby()); } Zomby::~Zomby() { _semaphore = false; if (_thread.joinable()) { _thread.detach(); } if (_listener) { std::ostringstream buf; buf << typeid(*this).name() << "::" << __func__ << std::endl; _listener->processData(std::make_shared<Common::Listener::Data>(buf.str())); } } void Zomby::runOnce(std::shared_ptr<Common::Listener> listener) { if (_semaphore) { throw std::runtime_error("BoozdedZomby::Zomby::runOnce() called twice"); } _listener = listener; _semaphore = true; _thread = std::thread([shis = shared_from_this()]() { while (shis && shis->_semaphore && shis->_listener) { auto handler = [shis](auto errorCode) { if (shis && shis->_listener && errorCode == boozd::azzio::io_context::error_code::no_error) { std::ostringstream buf; buf << "BoozdedZomby has got a fresh data: "; for (auto const &elem : shis->_buffer) buf << elem << ' '; buf << std::endl; shis->_listener->processData(std::make_shared<Common::Listener::Data>(buf.str())); } }; shis->_buffer.clear(); shis->_context.async_read(shis->_stream, shis->_buffer, handler); shis->_context.run(); } }); } } // namespace BoozdedZomby
main.cpp #include <chrono> #include <thread> #include <sstream> #include "BoozdedZomby/BoozdedZomby.h" #include "Common/Impl/WriteToConsoleListener.h" int main() { auto writeToConsoleListener = Common::WriteToConsoleListener::instance(); { auto boozdedZomby = BoozdedZomby::Zomby::create(); boozdedZomby->runOnce(writeToConsoleListener); std::this_thread::sleep_for(std::chrono::milliseconds(4500)); } // Zombies should be killed here { std::ostringstream buf; buf << "============================================================\n" << "| Zomby was killed |\n" << "============================================================\n"; if (writeToConsoleListener) { writeToConsoleListener->processData(std::make_shared<Common::Listener::Data>(buf.str())); } } std::this_thread::sleep_for(std::chrono::milliseconds(5000)); return 0; }
рдХрдВрд╕реЛрд▓ рдЖрдЙрдЯрдкреБрдЯBoozdedZomby has got a fresh data: 1144108930 101027544 1458777923 1115438165 74243042
BoozdedZomby has got a fresh data: 143542612 1131570933
BoozdedZomby has got a fresh data: 893351816 563613512 704877633
BoozdedZomby has got a fresh data: 1551901393 1399125485 1899894091 937186357 590357944 357571490
============================================================
| Zomby was killed |
============================================================
BoozdedZomby has got a fresh data: 1927702196 130060903 1083454666 2118797801 2035308228 824938981
BoozdedZomby has got a fresh data: 2020739063 1635339425 34075629
BoozdedZomby has got a fresh data: 2146319451 500782188 1269406752 884936716 892053144
BoozdedZomby has got a fresh data: 330111137 1723153177 1070477904
BoozdedZomby has got a fresh data: 343098142 280090412 589673557 889688008 2014119113 388471006
Run_once () рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдПрдХ рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрдн рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ред рджреГрд╢реНрдпрддрд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рднреА рдЬрд╝реЛрдВрдмреА рдиреЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрд╛редрд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рджреМрд░рд╛рди рдмрдирд╛рдИ рдЧрдИ рдХрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛: - boozdedZomby;- рд░рд╛рдЗрдЯрдСрдирдХреЛрдиреНрд╕реЛрд▓рд┐рд╕реНрдЯрдирд░;- рдЬрд╝реЛрдВрдмреА рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдбредрд╕реНрдореГрддрд┐ рд░рд┐рд╕рд╛рд╡ рд╣реБрдЖ рд╣реИредрд░рд┐рд╕реЛрд░реНрд╕ рд▓реАрдХ рд╣реБрдЖ рдерд╛редрдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рд╕реЗ рдЕрд▓рдЧ рдХреИрд╕реЗ рд╣реИ?рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдХреЗ рдмрд╣реБрдд рдХрд░реАрдм рд╣реИред рдпрд╣ рдЕрдм рдПрдХ рд╕рд┐рдВрдереЗрдЯрд┐рдХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИред рдмрдврд╝рд╛рд╡рд╛ рджреЗрдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдРрд╕рд╛ рдХреЛрдб рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :: asioред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдХ рдХрдордЬреЛрд░ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдПрдХ рдордЬрдмреВрдд рд▓рд┐рдВрдХ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рд╕реЗ рдЗрдирдХрд╛рд░ рдХрд░рдХреЗ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдмрдлрд░ рдФрд░ рд╕реНрдЯреНрд░реАрдо (рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд) рдХреА рд╡реИрдзрддрд╛ рдХреЗ рд╕рд╛рде рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░реЗрдЧрд╛редрд╡реЗрд▓рдЧреНрд░рд┐рдВрдб?рдХреЗ рджреНрд╡рд╛рд░рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд▓реАрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрдЬрдВрдЧрд▓ рдореЗрдВ рд▓рд╛рд╢
рд╕рдорд╕реНрдпрд╛ рджреВрд░ рдХреА рдХреМрдбрд╝реА рд╣реИ! рддреЛ рдХреЛрдИ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ!рдЬреИрд╕рд╛ рд╡рд╣ рд▓рд┐рдЦрддрд╛ рд╣реИредрдЙрджрд╛рд╣рд░рдг HTTP рдХреНрд▓рд╛рдЗрдВрдЯрдЙрджрд╛рд╣рд░рдг Websocket рдХреНрд▓рд╛рдЗрдВрдЯрдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдмреВрд╕реНрдЯ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдПрдХ рд╣рд╛рдЗрдмреНрд░рд┐рдб BoozdedZomby + SteppingZomby рд▓рд┐рдЦрдирд╛ рд╕рд┐рдЦрд╛рддрд╛ рд╣реИред рдЙрд╕реЗ рд░реЛрдХрдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдбреЗрдореЛ рдХреЛрдб рдореЗрдВ, рдЬрд╝реЛрдВрдмреА рдХреА рдореБрдЦреНрдп рд╕рдВрдкрддреНрддрд┐ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЗрд╕реЗ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдФрд░ рдЕрдм рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рдирд╛рд░реЗ рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдЕрдВрдзреЗрд░рд╛ рддрд░рдл рднреАредрдЖрдк рдмрдврд╝рд╛рд╡рд╛ рдХреЛ рдирд╖реНрдЯ рдХрд░рдХреЗ рд▓рд╛рд╢ рдХреЛ рд░реЛрдХ рд╕рдХрддреЗ рд╣реИрдВ :: asio :: io_context рдЙрджрд╛рд╣рд░рдг!... рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ, рдЗрд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдФрд░ рдПрди рд╕рдВрд╕реНрдерд╛рдУрдВ (рд╕рдВрднрд╡рддрдГ рдЧреИрд░-рд▓рд╛рд╢) рдХреЛ рдирд╖реНрдЯ рдХрд░рдирд╛редрдЕрдзрд┐рдХ рдЙрджрд╛рд╣рд░рдг:рдпрд╣рд╛рдВ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рдВрд╕рд╛рдзрди рдкрд░ рдПрдХ рд╕рдорд╛рди рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрдпрд╣рд╛рдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдПрдХ рд╕рд╡рд╛рд▓ рдкреВрдЫрддрд╛ рд╣реИ, рд╡рд╣ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрд╝реЛрдВрдмреА рдХреИрд╕реЗ рдмрдирд╛рдПрдЧрд╛рдпрд╣рд╛рдВ рдПрдХ рдЕрдиреНрдп рд╡реНрдпрдХреНрддрд┐ рдкреВрдЫ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЙрд╕рдХреА рдкреНрдпрд╛рд░реА рд▓рд╛рд╢ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИредрдпрд╣рд╛рдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдЬрд╝реЛрдВрдмреА рдХреЛ рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢реЛрдВ рд╕реЗ рдбрд░рддрд╛ рд╣реИредрдирд┐рд╖реНрдХрд░реНрд╖
рдмреЗрд╢рдХ, рд▓реЗрдЦ рдПрдВрдЯреАрдкреИрдЯрд░ "рд▓рд╛рд╢" рдХреА рд╕рднреА рдХрд┐рд╕реНрдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИредрдпрд╣ рдЙрдкрд░реЛрдХреНрдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдХрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдФрд░ рдирдП рд╕реНрд╡рддрдВрддреНрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджреЛрдиреЛрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдПрдВрдЯреАрдкреИрдЯрд░реНрди рди рдХреЗрд╡рд▓ рддрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ std :: рдереНрд░реЗрдб рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХрд╛рдо рдХрд╛ рдпрд╣ рд╣рд┐рд╕реНрд╕рд╛ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рд▓рд╛рдЗрдмреНрд░реЗрд░реА рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдПрдХ рдЪрдХреНрд░реАрдп рд▓рд┐рдВрдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд▓рдВрдмрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдпрд╛ рддреЛ рдШрдЯрдирд╛-рдЪрд╛рд▓рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрд╛ рдЖрд╡рдзрд┐рдХ рдорддрджрд╛рди-рдЖрдзрд╛рд░рд┐рдд рдорддрджрд╛рди рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИредрдпрд╣ рд╕рдм рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИредрдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдореЗрд╢рд╛рдПрдВрдЯреАрдкреИрдЯрд░реНрди рдЙрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЦреБрдж рдХреЛ рдПрдХ рдордЬрдмреВрдд рд╕рдВрджрд░реНрдн рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣ рд▓рдЧрднрдЧ рд╣рдореЗрд╢рд╛ std :: enable_sared_from_this рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЗрд╕реЗ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рднреА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдПрдХ рдХрдордЬреЛрд░ рд▓рд┐рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ - рд╡рд░реНрдЧ рд╣реА рдЗрд╕реЗ рдордЬрдмреВрдд рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ)ред рд╢рд╛рдпрдж рдЗрд╕ рдирд┐рдпрдо рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рджреЗрд╢реА рдЕрдкрд╡рд╛рдж рд╣реИ: рдЬрдм рдмрд╛рд╣рд░реА рдХреЛрдб рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдордЬрдмреВрдд рдпрд╛ рдХрдордЬреЛрд░ рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИредрдбрд╛рдпрдирд╛рдорд┐рдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╢рд╛рдпрдж рдЗрд╕ рдПрдВрдЯреАрдкреИрдЯрд░реНрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рди рд╣реЛ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд╕реНрдЯреЗрдкрд┐рдВрдЧрдЬрд╝реЛрдордмреА рдХреЗ рд╕рдВрд╕реНрдХрд░рдгред рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рдХрдо рдЙрдореНрдореАрдж рд╣реИ - рд╢реЗрдпрд░реНрдб_рдлреНрд░реЛрдо_рдерд┐рд╕ рдХреЗ рд╕рд╣реА рдФрд░ рдЧрд▓рдд рдЙрдкрдпреЛрдЧ рдХреЗ рдмреАрдЪ рдПрдХ рдмрд╣реБрдд рдкрддрд▓реА рд░реЗрдЦрд╛ (рд▓реЗрдЦ рдореЗрдВ рджрд┐рдП рдЧрдП рд╕рднреА рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдмрд╣реБрдд рдЫреЛрдЯреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдХреЗ рдареАрдХ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдХреЗрд╡рд▓ 1 рд╕реЗ 6 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдХреЛрдб)редрдСрдЯреЛрдЯреЗрд╕реНрдЯреНрд╕ рдЗрд╕реЗ рдкрд╣рдЪрд╛рдирдиреЗ рдФрд░ рдЙрдиреНрдореВрд▓рди рдХреА рд╢реБрджреНрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рджреЗрдЦрдирд╛ рд╣реИред рдмрд┐рд▓реНрдХреБрд▓ рдкрддрд╛ рд╣реИредрдЦреЛрдЬ рдПрдВрдЯреАрдкреИрдЯрд░реНрди, рдпрд╣рд╛рдВ рдФрд░ рд╡рд╣рд╛рдВ, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ std рдХреЗ рд╕рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :: enable_sared_from_this - рд╡реЗ рдмрд╣реБрдд рдЦрддрд░рдирд╛рдХ рд╣реИрдВредрдкреБрдирд╢реНрдЪ: рдорддрджрд╛рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ - рдореИрдВ рдПрдВрдЯреАрдкреИрдЯрд░реНрди рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдЪрд░реНрдЪрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рддреИрдпрд╛рд░ рдХрд░реВрдВрдЧрд╛ред