看完這篇的感想
簡單的用 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
回覆刪除