effective c++以獨立語句將newed對象植入智能指針

int priority(){}
struct Widget{};
void processWidget(shared_ptr<Widget>pw,int priority){}
int main()
{
    processWidget(new Widget,priority());
    //產生編譯錯誤,因爲shared_ptr構造函數需要一個原始指針
    //但是該構造函數是一個explicit構造函數,無法進行隱式轉換
}
int priority(){throw 1;}
class Widget{};
void processWidget(shared_ptr<Widget>pw,int priority){}
int main()
{
    try{
        processWidget(shared_ptr<Widget>(new Widget),priority());
        //在c++中,參數的核算的次序是沒有定義的
        //執行new Widget
        //調用shared_ptr的構造函數
        //調用priority()
        //唯一能夠確定的就是new Widget在調用shared_ptr的構造函數之前
        //但是如果先執行new Widget,然後調用priority(),最後調用shared_ptr的構造函數
        //如果對調用priority()產生異常,new Widget返回的指針將會遺失
        //在對processWidget的調用過程中引發了資源的泄露
    }
    catch(...){

    }
}

書上是這麼說的,但是我卻想不到因爲調用異常而導致其他地方的失誤。。。書上也沒有給出感性的例子。。。

int priority()
{
    throw 1;
}
class Widget
{
public:
    void c(){cout << 1 << endl;}
};
void processWidget(shared_ptr<Widget>pw,int priority)
{
    try{}
    catch(...){cout << "aaa" << endl;}
}
int main()
{
    try{
        processWidget(shared_ptr<Widget>(new Widget),priority());
    }
    catch(...)
    {
        cout << "there" << endl;
    }
}

參數產生異常,並不會進入函數!!更不要說用到shared_ptr的問題了!!

shared_ptr<Widget>pw(new Widget);
    processWidget(pw,priority());
    //這樣就安全了

但是至少深化了:
c++沒有定義參數執行的次序
java 和 c#定義了!
以獨立語句將newed對象儲存於智能指針內

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章