2009年12月14日 星期一

smart_ptr

看完這篇的感想
簡單的用 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_2life 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

2 則留言:

  1. boots 的 Smart Ptr 是採用計數器的技術,沒法處理循環參照,會造成 memory leak

    回覆刪除