рдирд┐рд░реНрдзрд╛рд░рдХ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рд╕реВрдЪрдХ рд╕реЗ рдорд┐рд▓реЗрдВ

рдореЗрдореЛрд░реА, рд╕реА ++ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рдореБрд╢реНрдХрд┐рд▓ рдерд╛ ( рд╕реА рдХреА рдХрдбрд╝рд╡реА рд╡рд┐рд░рд╛рд╕рдд) ... рдпрд╣рд╛рдВ рд╕реА ++ 11 рдЕрдкрдиреЗ рдПрд╕рдЯреАрдбреА рдХреЗ рд╕рд╛рде :: рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛, рдЕрдЧрд░ рдЗрди рдЖрджрд┐рдорд┐рдпреЛрдВ рдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА, рддреЛ рдпрд╣ рд▓реЗрдЦ рдирд╣реАрдВ рд╣реЛрдЧрд╛ :)

рдЖрдЗрдП std рдкрд░ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдореЗрдореЛрд░реА рд▓реАрдХ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ: share_ptr :

#include <iostream> #include <memory> class Child; class Parent { public: Parent() { std::cout << "Parent()" << std::endl; } ~Parent() { std::cout << "~Parent()" << std::endl; } void createChild() { child_ptr_ = std::make_shared<Child>(); } std::shared_ptr<Child> getChild() { return child_ptr_; } private: std::shared_ptr<Child> child_ptr_; }; class Child { public: Child() { std::cout << "Child()" << std::endl; } ~Child() { std::cout << "~Child()" << std::endl; } void setParent(std::shared_ptr<Parent> parentPtr) { parent_ptr_ = parentPtr; } private: std::shared_ptr<Parent> parent_ptr_; }; int main() { auto parent = std::make_shared<Parent>(); parent->createChild(); parent->getChild()->setParent(parent); return 0; } 

рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреА рдХреЙрд▓ рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ? std :: weak_ptr рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИ:

 ... class Child { ... void setParent(std::shared_ptr<Parent> parentPtr) { parent_ptr_ = parentPtr; } private: std::weak_ptr<Parent> parent_ptr_; }; ... 

рд╣рд╛рдВ, рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИ рдФрд░ рдпрд╣ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХрд┐ рдХрд┐рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП std :: weak_ptr рдФрд░ рдХрд┐рд╕реЗ std рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :: share_ptr ? рдпрд╛ рдХреНрдпрд╛ рдЖрдк рдвреАрд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рдЧрдбрд╝рдмрдбрд╝ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдХрдЪрд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣рдорд╛рд░рд╛ рд╕рдм рдХреБрдЫ рд╣реИ !!

рдирд╣реАрдВ, рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВред C ++ рдореЗрдВ, рдЧрд╛рд░рдмреЗрдЬ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рджреЗрд╢реА рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЕрдЧрд░ рдЗрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рднреА рд╣рдореЗрдВ рдЧрд╛рд░рдмреЗрдЬ рдХрд▓реЗрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд╣реЗрдб рд▓рд╛рдЧрдд рдорд┐рд▓рддреА рд╣реИ, рд╕рд╛рде рд╣реА RAII рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВ?

рдирд┐рд░реНрдзрд╛рд░рдХ рдЧрд╛рд░рдмреЗрдЬ рдХрд▓реЗрдХреНрдЯрд░ рдкреЙрдЗрдВрдЯрд░ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рд╣реИ рдЬреЛ рд░реВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рд╕реЗ рд╕рднреА рд▓рд┐рдВрдХ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЬреИрд╕реЗ рд╣реА рд░реВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╣рдорд╛рд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рддреБрд░рдВрдд рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд std :: рд╕рд╛рдЭрд╛_ptr (рдпрд╣ рд╕реНрдХреЛрдк рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ ) рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛ рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рджреЗрдЦреЗрдВ:

 #include <iostream> #include "gc_ptr.hpp" class Child; class Parent { public: Parent() { std::cout << "Parent()" << std::endl; } ~Parent() { std::cout << "~Parent()" << std::endl; } void createChild() { child_ptr_.create_object(); } memory::gc_ptr<Child> getChild() { return child_ptr_; } void connectToRoot(void * rootPtr) { child_ptr_.connectToRoot(rootPtr); } void disconnectFromRoot(bool isRoot, void * rootPtr) { child_ptr_.disconnectFromRoot(isRoot, rootPtr); } private: memory::gc_ptr<Child> child_ptr_; }; class Child { public: Child() { std::cout << "Child()" << std::endl; } ~Child() { std::cout << "~Child()" << std::endl; } void setParent(memory::gc_ptr<Parent> parentPtr) { parent_ptr_ = parentPtr; } void connectToRoot(void * rootPtr) { parent_ptr_.connectToRoot(rootPtr); } void disconnectFromRoot(bool isRoot, void * rootPtr) { parent_ptr_.disconnectFromRoot(isRoot, rootPtr); } private: memory::gc_ptr<Parent> parent_ptr_; }; int main() { memory::gc_ptr<Parent> parent; parent.create_object(); parent->createChild(); parent->getChild()->setParent(parent); return 0; } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╣ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд connectToRoot рдФрд░ disconnectFromRoot рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдмреЗрд╢рдХ, рд╣рд░ рд╕рдордп рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрди рддрд░реАрдХреЛрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рдЬрдирд░реЗрдЯрд░ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдмрдирд╛рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддрд╛ рд╣реВрдВ рдЬреЛ gc_ptr рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рд╢реВрдиреНрдп-рдУрд╡рд░рд╣реЗрдб рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рднреБрдЧрддрд╛рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╣рдо рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ- рддрдм рд▓рд╛рдЧрддреЗрдВ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ)ред

Gc_ptr.hpp рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдереНрд░реЗрдб-рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ, рдпрд╣ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдереНрд░реЗрдб рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░, рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░реЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдЕрдкрдиреА рд╡рд╕реНрддреБ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреЛрдИ рд░реВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдм рдЗрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдореГрддрд┐ред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

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


All Articles