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對象儲存於智能指針內