考慮以下代碼
void processWidget(shared_ptr<Widget> pw, int pri); //函數(shù)聲明
processWidget(shared_ptr<Widget>(new Widget), pri())//函數(shù)調(diào)用 pri()返回一個int
Widget的構(gòu)造肯定要早于shared_ptr對象的構(gòu)造,這是毋庸置疑的,但是pri()在什么時候執(zhí)行呢?
假如現(xiàn)在的次序是這樣的:
1.Widget的構(gòu)造
2.pri()
3.shared_ptr的構(gòu)造
假如pri()函數(shù)導致了一個異常,這時候構(gòu)造的Widget就不會被置于智能指針中。
要避免這類問題的辦法非常簡單,就是單獨寫出Widget的構(gòu)造以及shared_ptr的構(gòu)造。
shared_ptr<Widget> pw(new Widget);
processWidget(pw, pri());