看完這篇的感想
簡單的用 boost 作些實驗
about smart讓我們看摳布拉潔怎麼說
about weak_ptr
Smart_ptr 幫助我們 handle 資源的 delete
所以不必擔心某個東西被new出來後 要到哪裡去 delete
(或是忘記 delete造成 leak)
下面的程式碼可以看出好用之處
class Object { public: Object(){cout << "A Object created" <<endl; }; ~Object(){cout << "Object deleted" << endl; } void print() {std::cout << " Object::print" << std::endl;} Object(const Object&); Object& operator = (const Object&); }; void test_smartpointers() { int scopeA = 1; if(scopeA == 1) { boost::shared_ptr<object> management; //boost::weak_ptr<object> management; //Object* management; int ScopeC = 1; if (ScopeC == 1) { boost::shared_ptr<object> obj_2 (new Object()); boost::shared_ptr<object> model(obj_2); management = obj_2; //management = obj_2.get(); model->print(); } management->print(); } }
Obj_2離開 ScopeC的時候並沒有真的 delete
因為此時management還有reference到它
一直到離開scopeA的時候 才會被自動的 delete掉
至於甚麼時候用的到小老百姓 weak_ptr?
當我們不希望 obj_2的life time被綁死的時候
所以 management改用了這個宣告
boost::weak_ptr<object> management;
如此一來obj_2就會在離開 ScopeC的時候就destruct
weak_ptr 解決了這個問題 (不知道還有沒有其他的)
如果改成這樣
void test_smartpointers() { int scopeA = 1; if(scopeA == 1){ Object* management; int ScopeC = 1; if (ScopeC == 1) { boost::shared_ptr<object> obj_2 (new Object()); boost::shared_ptr<object> model(obj_2); management = obj_2.get(); model->print(); } management->print();// should have problem here } }
真的call到最後一行的 print() 在vc2008的環境也不會有事
Related link
Déjà vu~ haha
回覆刪除boots 的 Smart Ptr 是採用計數器的技術,沒法處理循環參照,會造成 memory leak
回覆刪除