рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреА рд╕реЗрд╡рд╛ рдореЗрдВ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рдЖрд░рдПрдЖрдИ

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд░рдмрдВрдзрди рдЪрд╛рд╣рддрд╛ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдп рдЬрд▓реНрджреА рд╕реЗ рдкреВрд░рд╛ рд╣реЛред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛрдб рдХреА рд╕реБрдВрджрд░рддрд╛ рдФрд░ рд╢реБрджреНрдзрддрд╛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдкреЛрд╕реНрдЯ C ++ 11 - рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдореЗрдВ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдП рдЧрдП рдирд╡рд╛рдЪрд╛рд░реЛрдВ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдореБрдХреНрдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдирдХрд╛рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, stdio.h рд╕реЗ FILE рдлрд╛рдЗрд▓ рд╕реНрдЯреНрд░реАрдо рд▓реЗрдВ, рдЬреЛ рд╕рд╛рджрдЧреА рдФрд░ рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдкрд╕рдВрдж рдХреА рдЬрд╛рддреА рд╣реИ, рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕рдореЗрдВ рд╕реБрдВрджрд░рддрд╛ рдФрд░ рдореВрд▓ рдЧрд╛рд░рдВрдЯреА рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
unique_ptr<FILE, decltype(&fclose)> my_file(fopen("test.txt", "w"), &fclose); if(my_file) fwrite("test", 4, 1, my_file.get()); 

рдирддреАрдЬрддрди, рдХреЛрдб рдХреЗрд╡рд▓ рдПрд╕рдЯреАрдПрд▓ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдореВрд▓реА рд╕рдВрд╢реЛрдзрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд▓реНрджреА рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрдзреБрдирд┐рдХ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЗрд╕рдиреЗ RAII рдХреЛ рдЕрдкрдиреЗ рд╢реБрджреНрдзрддрдо рд░реВрдк рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ред

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рдлреЛрдкреЗрди рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕реВрдЪрдХ рдХреЛ рдЯрд╛рдЗрдк FILE рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ my_file рд╡реИрд░рд┐рдПрдмрд▓ рдореЗрдВ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде fclose рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рд╕реНрд╡рд╛рдорд┐рддреНрд╡ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдлреЗрдХрд▓реЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрдм рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛?


  1. рдПрдХ рдЪрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ) рдХреЗ рджрд╛рдпрд░реЗ рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╕рдордпред
  2. рдпрджрд┐ my_file рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдИ рдЕрдкрд╡рд╛рдж рд╣реЛрддрд╛ рд╣реИред
  3. рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рдСрдмреНрдЬреЗрдХреНрдЯ my_file рдкрд░ред
  4. My_file.reset рдкрд░ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп ()ред

рдУрд╡рд░рд╣реЗрдб рдХреНрдпрд╛ рд╣реИ?


  1. рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдлреЗрдХ рдХреЙрд▓ рдХреЛ рд╣рдЯрд╛рдПрдВ рдФрд░ рдЕрдиреВрдареЗ_ptr <...> :: get () рдХреЙрд▓ рдХреЛ рд╕рднреА рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕реЗрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
  2. рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдлрд╛рдЗрд▓ рдбрд┐рд▓реАрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рд╕реЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдкреВрд░реА рддрд░рд╣ рд╕реЗ, рдпрд╣ рд╕рд┐рд░реНрдл рдЖрдкрдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ fclose рдХреЙрд▓ рдХрд░реЗрдЧрд╛, рдкреВрд░реА рддрд░рд╣ рд╕реЗ my_file рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХреНрдпрд╛ рдлрд╛рдпрджреЗ рд╣реИрдВ?


  1. рдХрд┐рд╕реА рднреА рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд╕рд╛рде, рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдорд╛рд▓рд┐рдХ рдХреИрд╕реЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (unique_ptr)ред
  2. рдЖрдк рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
     typedef unique_ptr<FILE, decltype(&fclose)> MyFileType; 
  3. рдпрджрд┐ рдЖрдк рдмрд╣реБрдд рд╕рд╛рд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ
     MyFileType MakeFile(const char* filename, const char* mode) { return unique_ptr<FILE, decltype(&fclose)>(fopen(filename, mode), &fclose); } 
    ... рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
     auto my_file = MakeFile("test.txt", "w"); 
  4. рдЖрдкрдХреЛ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдмрд╣реБрдд рдЬреНрдпрд╛рджрд╛ рдХреНрдпреЛрдВ? рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рдВрдХрд▓рдХ рдХреЛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдм рдпрд╣ рдЙрд╕рдХрд╛ рдХрд╛рдо рд╣реИред
  5. рдЖрдк рдорд╛рдирдХ STL рдХрдВрдЯреЗрдирд░реЛрдВ рдореЗрдВ MyFileType рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
     vector<MyFileType> my_files; my_files.push_back(MakeFile("test.txt", "w")); 
    ... рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдЬреАрд╡рдирдХрд╛рд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрдкрдирд╛ рд╕рдордп рдмрд░реНрдмрд╛рдж рдордд рдХрд░реЛред C ++ 11 рдореЗрдВ, рд╡реЗрдХреНрдЯрд░ <MyFileType> рдХреЛ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕реА рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдХреБрдЫ рдФрд░ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:


рдЬреЛ рд▓реЛрдЧ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдкрд░ рд╣реИрд░рд╛рди рдпрд╛ рдЙрддреНрд╕реБрдХ рд╣реИрдВ, рд╡реЗ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрд░реЗрдЦрд┐рдд рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рддреЗрдЬ рд╣реИред рддреЛ рдЖрдк Microsoft Visual C рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 16 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдЬреБрдбрд╝реА рдореЗрдореЛрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 unique_ptr<char[], decltype(&::_aligned_free)> my_buffer((char*)(_aligned_malloc(512, 16)), &_aligned_free); my_buffer[0] = 'x'; //   

рдПрдХ рдмрд╛рд░ рдЯреЗрдореНрдкрд▓реЗрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рдж:
 template<typename T> unique_ptr<T[], decltype(&::_aligned_free)> MakeAlignedBuffer(size_t element_count, size_t alignment = alignment_of<T>::value) { return unique_ptr<T[], decltype(&::_aligned_free)> (reinterpret_cast<T*>(_aligned_malloc(element_count*sizeof(T), alignment)), &_aligned_free); } 
рдЖрдк рдЕрд▓рдЧ-рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдореЗрдореЛрд░реА рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдирдП [] рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛, рджреВрд╕рд░реЗ рдореЗрдВ рд╣рдЯрд╛рдП рдЧрдП рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛)ред

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ WinAPI рд╕рдВрд╕рд╛рдзрди рдХреЗ рдорд╛рд▓рд┐рдХ рд╣реЛрдВ?


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдЬрдм рдПрдХ рдЬреАрдпреВрдЖрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рднрд░реА рд╣реБрдИ рдбреАрдПрд▓рдПрд▓ рдореЗрдВ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕рдордп рдкрд░ рдЙрддрд╛рд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛рдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗ:
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓реЛрдб рд╣реЛ рд░рд╣реА рд╣реИ ...
 auto my_module = shared_ptr<HMODULE>(new HMODULE(LoadLibrary(_T("my_library.dll"))), [](HMODULE* instance){ FreeLibrary(*instance); //         }); 
рдЕрдЧрд▓рд╛, рд╣рдо рд╡рд╕реНрддреБрдУрдВ рдХреЛ my_module рд╡рд┐рддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ...
 module_owner1.set_module(my_module); module_owner2.set_module(my_module); //     vector   
рд╡рд╕реНрддреБ рдореЗрдВ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ...
 if(my_module && *my_module) { auto func1 = GetProcAddress(*my_module, "MyFunc"); } 
рдЬрдм рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рджреЗрддреЗ рд╣реИрдВ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХрд╛рдЙрдВрдЯрд░ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлреНрд░реАрд▓рд╛рдВрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЕрдиреВрдареЗ_рдкреНрдЯреНрд░ рдореЗрдВ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ?


рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
 auto my_instance = std::unique_ptr<HMODULE, function<void(HMODULE*)>> (new HMODULE(LoadLibrary(_T("my_library.dll"))), [](HMODULE* instance){ FreeLibrary(*instance); }); 

рдирд┐рд╖реНрдХрд░реНрд╖


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

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


All Articles