рд╢реБрд░реБрдЖрддреА рдХреЗ рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕

рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╢реБрд░реБрдЖрддреА рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬреЛ рдпрд╛ рддреЛ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдбрд░рддреЗ рдереЗ, рдпрд╛ рд╡реЗ рдирдП-рдбрд┐рд▓реАрдЯ рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрддреЗ рд╣реБрдП рдердХ рдЧрдП рдереЗред

UPD: рд▓реЗрдЦ рддрдм рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм C ++ 11 рдЕрднреА рддрдХ рдЗрддрдирд╛ рд▓реЛрдХрдкреНрд░рд┐рдп рдирд╣реАрдВ рдерд╛ред

рдЗрд╕рд▓рд┐рдП, C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореЗрдореЛрд░реА рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдореЗрд╢рд╛ рд╡рд╛рдВрдЫрдиреАрдпред рдФрд░ рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдирдпрд╛ рдХрд╣реАрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕рдорд╛рди рд╡рд┐рд▓реЛрдкрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдХреЗ рд╕рд╛рде рдореИрдиреБрдЕрд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рднрдпрд╛рд╡рд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде:

рдПрдХ рд░рд┐рд╕рд╛рд╡, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо 24/7 рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдХреЛрдб рдЗрд╕реЗ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдЬрдм рдПрдХ рдЕрд╢рдХреНрдд рд╕реВрдЪрдХ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдПрдХ рд╕реЗрдЧрдлреЙрд▓реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдорд╛рдорд▓реЗ рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдЬрдм рдпрд╣ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░рд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ)ред рдмрд╛рд░-рдмрд╛рд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд╕рд╛рде, рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ), рдпрджрд┐ рдореЗрдореЛрд░реА рдХрд╛ рдПрдХ рдмреНрд▓реЙрдХ рдЖрдкрдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдЖрдЧреЗ рдХрд╣реАрдВ рдПрдХ рдореВрд▓реНрдп рдирд┐рд╣рд┐рдд рд╣реИ рдЬреЛ рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╡рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдкрдиреЗ рдХреБрдЫ рдкрддреЗ рдкрд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА 1 kb рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рд╣реИред рдлрд┐рд░, 1024 рдирдВрдмрд░ рдХреЛ рдкрд┐рдЫрд▓реЗ рдкрддреЗ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛рддреЗ рд╕рдордп рдореЗрдореЛрд░реА рдХреЗ рдмрд┐рд▓реНрдХреБрд▓ 1024 рдмрд╛рдЗрдЯ рдХреЛ рд╣рдЯрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рдФрд░ рдХрдо рдирд╣реАрдВред рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рдЖрдк рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЖрдк рдЧрд▓рдд рдбреЗрдЯрд╛ рдорд┐рдЯрд╛ рджреЗрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдм рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреА рддреНрд░реБрдЯрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдкрд░рд┐рдЪрдп


RAII рдирд╛рдордХ рд╕реНрдерд╛рдиреАрдп рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрди рддрдХрдиреАрдХ рд╣реИред рдпрд╣реА рд╣реИ, рдЬрдм рдПрдХ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рд╛рдЗрд▓, рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рдХрдиреЗрдХреНрд╢рди, рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдореЗрдореЛрд░реА рдмреНрд▓реЙрдХред рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
class VideoBuffer { int *myPixels; public: VideoBuffer() { myPixels = new int[640 * 480]; } void makeFrame() { /*    */ } ~VideoBuffer() { delete [] myPixels; } }; int game() { VideoBuffer screen; screen.makeFrame(); } 

рдпрд╣ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ: рдЬрдм рд╣рдо рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдмрдлрд░ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдХреНрд░реАрди рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдПрдиреНрдХреИрдкреНрд╕реБрд▓реЗрдЯреЗрдб рдкрд┐рдХреНрд╕реЗрд▓ рд╕рд░рдгреА рдХреЛ рдореБрдХреНрдд рдХрд░реЗрдЧрд╛ред рдмреЗрд╢рдХ, рдЖрдк рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 int game() { int *myPixels = new int[640 * 480]; //  delete [] myPixels; } 

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рдХреЛрдб рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
 int game() { int *myPixels = new int[640 * 480]; //  if (someCondition) return 1; //   if (someCondition) return 4; //  delete [] myPixels; } 

рдлрд╝рдВрдХреНрд╢рди рдирд┐рдХрд╛рд╕ рдХреА рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдореЗрдВ рдбрд┐рд▓реАрдЯ [] рд▓рд┐рдЦрдирд╛ рдпрд╛ рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдбреА-рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдФрд░ рдЕрдЧрд░ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рд╣реИрдВ, рдпрд╛ рд╡реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╣рд┐рд╕реНрд╕реЛрдВ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ? рдЗрд╕ рд╕рдм рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдирд╛ рдХрдард┐рди рдФрд░ рдХрдард┐рди рд╣реЛрдЧрд╛ред рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ рддрдм рд╣реЛрддреА рд╣реИ рдЬрдм рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддреЗ рд╣реИрдВ: рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╕реНрдЯреИрдХ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдЦреБрд▓реА рд░рд╣рддреА рд╣реИред
рдареАрдХ рд╣реИ, рд╣рдо RAII рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рдореЗрдореЛрд░реА рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдореБрдХреНрдд рдХрд░реЗрдВрдЧреЗред рдФрд░ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд╕реНрдореГрддрд┐ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░рддреЗ рд╣реИрдВ:
 class Foo { int *data1; double *data2; char *data3; public: Foo() { data1 = new int(5); ... } ~Foo() { delete data1; ... } } 

рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдлрд╝реАрд▓реНрдб 3 рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди 30 рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдЖрдкрдХреЛ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рд╣рдЯрд╛рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЕрдЧрд░ рдЬрд▓реНрджреА рдореЗрдВ рд╣рдо рдПрдХ рдирдпрд╛ рдХреНрд╖реЗрддреНрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдорд╛рд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛрдВрдЧреЗред рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдореЗрдореЛрд░реА рдПрд▓реЛрдХреЗрд╢рди / рдбреАрд▓рд▓реЛрдХреЗрд╢рди рдСрдкрд░реЗрд╢рдВрд╕ рд╕реЗ рднрд░рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдпрд╛ рдирд╣реАрдВред
рдЗрд╕рд▓рд┐рдП, рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИ: рдпреЗ рдРрд╕реА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдЬреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдПрдХ рдордирдорд╛рдиреЗ рдкреНрд░рдХрд╛рд░ рдХреА рдореЗрдореЛрд░реА рдХреЗ рдбрд╛рдпрдирд╛рдорд┐рдХ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддреА рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдЧреБрдВрдЬрд╛рдЗрд╢ рдЫреЛрдбрд╝рдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореЗрдореЛрд░реА рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╡реЗ C ++ рдореЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рдЕрд╡рд▓реЛрдХрди рдкрд░ рдЬрд╛рдПрдВред

рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░


 //     template <typename T> class smart_pointer { T *m_obj; public: //       smart_pointer(T *obj) : m_obj(obj) { } //          ~smart_pointer() { delete m_obj; } //  < // .      T  "" T* operator->() { return m_obj; } //             // ,    T& operator* () { return *m_obj; } } int test { //  myClass     smart_pointer<MyClass> pMyClass(new MyClass(/*params*/); //     MyClass   pMyClass->something(); // ,          ostream //          , //       std::cout << *pMyClass << std::endl; //      MyClass   } 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХрдорд┐рдпрд╛рдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдПрдХ рд╕рд░рдгреА рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ?), рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ RAII рдореБрд╣рд╛рд╡рд░реЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХ (рдУрд╡рд░рд▓реЛрдб рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж) рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рд╕реНрдореГрддрд┐ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рд╕рдм рдХреБрдЫ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рдЕрддрд┐рднрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд╕реНрдЯ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджрд░реНрднрд┐рдд рдбреЗрдЯрд╛ рд╕реНрдерд┐рд░ рд╣реИред
рдЕрдм, рдпрджрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕реЗ рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдХреБрдЫ рд▓рд╛рдн рдорд┐рд▓ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЙрдирдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реИрд╕реЗ рднреА, рдЕрдкрдиреЗ рдереЛрдбрд╝реЗ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдЖрд╢реНрд╡рд╛рд╕рди рджреЗрддрд╛ рд╣реВрдВ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╕рдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рддреЛ, рд╣рдорд╛рд░реЗ рд╕реНрдорд╛рд░реНрдЯ рд╕рдВрдХреЗрдд:


рдмрдврд╝рд╛рд╡рд╛ :: scoped_ptr


рдпрд╣ рдмреВрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд░рд▓ рдФрд░ рд╕реАрдзрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ, рдХреБрдЫ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ: рдЗрд╕ рд╕реВрдЪрдХ рдХреЛ рдХреЙрдкреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд, рдЗрд╕рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рд╣реИ)ред рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛рдКрдВрдЧрд╛:
 #include <boost/scoped_ptr.hpp> int test() { boost::scoped_ptr<int> p1(new int(6)); boost::scoped_ptr<int> p2(new int(1)); p1 = p2; // ! } 

рдпрд╣ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпрджрд┐ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЧрдИ рдереА, рддреЛ p1 рдФрд░ P2 рдПрдХ рд╣реА рдореЗрдореЛрд░реА рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВрдЧреЗред рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░, рджреЛрдиреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЗрд╕ рд╕реВрдЪрдХ рдХреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдлрд┐рд░ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдореИрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рд╣реА рд╕рдлрд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд┐рд░рджрд░реНрдж рд╕реЗ рдЦреБрдж рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрдд рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдБ ред

std :: auto_ptr


рдкрд┐рдЫрд▓реЗ рдПрдХ рдХрд╛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╕рдВрд╕реНрдХрд░рдг, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ C ++ 11 рдореЗрдВ рдпрд╣ рдкрджрд╛рд╡рдирдд рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ)ред рдЗрд╕рдореЗрдВ рдПрдХ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдФрд░ рдПрдХ рдХреЙрдкреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ:
 #include <memory> int test() { std::auto_ptr<MyObject> p1(new MyObject); std::auto_ptr<MyObject> p2; p2 = p1; } 

рдЕрдм, рдЬрдм P2 рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ MyObject (рдЬреЛ рд╣рдордиреЗ p1 рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИ) рдХрд╛ рдкреЙрдЗрдВрдЯрд░ рд╣реЛрдЧрд╛, рдФрд░ p1 рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдпрд╣реА рд╣реИ, рдкреА 1 рдЕрдм рд╢реВрдиреНрдп рдкрд░ рд░реАрд╕реЗрдЯ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЖрдВрджреЛрд▓рди рдХрд╛ рддрдерд╛рдХрдерд┐рдд рд╢рдмреНрджрд╛рд░реНрде рд╣реИред рд╡реИрд╕реЗ, рдХреЙрдкреА рдСрдкрд░реЗрдЯрд░ рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдареАрдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
 std::auto_ptr<MyObject> giveMeMyObject(); 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди MyObject рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдирдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрдкрдХреЗ рдирд┐рдкрдЯрд╛рди рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп рд╣реИ (рдлреИрдХреНрдЯреНрд░реА рдХрд╣реЗрдВ): рдЖрдкрдХреЛ рдпрдХреАрди рд╣реИ рдХрд┐ рдпрд╣ рдХреНрд▓рд╛рд╕ (рдлрд╝реИрдХреНрдЯрд░реА) рдХрд┐рд╕реА рдЕрдиреНрдп рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреА рд╡рд╕реНрддреБ рдФрд░ рдПрдХ рд╕реВрдЪрдХред
рдРрд╕реЗ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджрд╛рд░реНрдереЛрдВ рдХреЗ рдХрд╛рд░рдг, Auto_ptr рдХрд╛ рдЙрдкрдпреЛрдЧ STL рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдордиреЗ share_ptr рдХрд┐рдпрд╛ рд╣реИред

std :: share_ptr (C ++ 11)


рд╕рдВрджрд░реНрдн рдЧрд┐рдирддреА рдХреЗ рд╕рд╛рде рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЪрд░ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдЪрд░ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╕реНрддреБ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдХрд╛рдЙрдВрдЯрд░ рдСрдкрд░реЗрдЯрд░ рдпрд╛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдпрд╛ рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рджреА рдЬрд╛рддреА рд╣реИред Shared_ptr рдореЗрдВ рдПрдХ рдмреВрд▓ рдХрд╛рд╕реНрдЯ рдСрдкрд░реЗрдЯрд░ рднреА рд╣реИ, рдЬреЛ рдЕрдВрддрддрдГ рд╣рдореЗрдВ рдореЗрдореЛрд░реА рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреА рдЪрд┐рдВрддрд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рдВрдЯреИрдХреНрд╕ рджреЗрддрд╛ рд╣реИред
 #include <memory> //  <tr1/memory>  ,    C++11 #include <iostream> int test() { std::shared_ptr<MyObject> p1(new MyObject); std::shared_ptr<MyObject> p2; p2 = p1; if (p2) std::cout << "Hello, world!\n"; } 

рдЕрдм P2 рдФрд░ p1 рджреЛрдиреЛрдВ рдПрдХ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ 2 рд╣реИ, рд╕реНрдХреЛрдк рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░, рдХрд╛рдЙрдВрдЯрд░ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 int test(std::shared_ptr<MyObject> p1) { //  - } 

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рдЗрдВрдХреНрд░реАрдореЗрдВрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдкрдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди MyObject рдЬреАрд╡рд┐рдд рд░рд╣реЗрдЧрд╛ред

рдЗрд╕рд▓рд┐рдП рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдЕрдЪреНрдЫреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдбрд╛рдЙрдирд╕рд╛рдЗрдбреНрд╕ рд╣реИрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рдУрд╡рд░рд╣реЗрдб рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪрдХреНрд░ рдорд┐рд▓реЗрдВрдЧреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдпрд╣ рдмреЙрдпрд▓рд░-рдкреНрд▓реЗрдЯ рд╣реИ
 std::tr1::shared_ptr<MyNamespace::Object> ptr = std::tr1::shared_ptr<MyNamespace::Object>(new MyNamespace::Object(param1, param2, param3)) 

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
 #define sptr(T) std::tr1::shared_ptr<T> 

рдпрд╛ рдЯрд╛рдЗрдкреНрдбрд┐рдл рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ред
рддреАрд╕рд░рд╛ , рдкрд░рд┐рдкрддреНрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдирд╣реАрдВ рдорд╛рдиреВрдВрдЧрд╛, рддрд╛рдХрд┐ рд▓реЗрдЦ рдХреЛ рдмрдбрд╝рд╛ рди рдХрд░ рд╕рдХреВрдВред рдмреВрд╕реНрдЯ :: weak_ptr, рдмрдврд╝рд╛рд╡рд╛ :: intrusive_ptr рдФрд░ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рднреА рдЕрдкрд░рд┐рдЪрд┐рдд рдмрдиреЗ рд░рд╣реЗред
рд╡реИрд╕реЗ, рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдЬреЗрдл рдЕрд▓реНрдЬреАрд░рд┐рдпрд╛ рджреНрд╡рд╛рд░рд╛ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реЛрдВ рдХреЗ рд▓рд┐рдП C ++" рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

Source: https://habr.com/ru/post/In140222/


All Articles