考虑下面两个函数
int priority();
void processWidget(std::shared_ptr<Widget> pw, int priority);
然后考虑调用processWidget
processWidget(new Widget, priority());
但是无法通过编译,因为无法将new Widget
的原始指针转化为processWidget所要求的只能指针,解决办法是将调用改写为如下形式:
processWidget(std::shared_ptr<Widget> (new Widget), priority());
在调用processWidget
函数体之前,编译器必须创建代码,做如下三件事:
- 调用
priority
- 执行
new Widget
- 调用
shared_ptr
构造函数
但是C++编译器以什么样的次序完成这些事情呢,可以确定是是new Widget
一定再shared_ptr
构造函数调用之前,但是对priority
的调用顺序则不确定,如果以第二顺位执行它:
- 执行
new Widget
- 调用
priority
- 调用
shared_ptr
构造函数
则可能会出现对proority
的调用异常,然后导致new Widget
返回的执行丢失,造成资源泄露,要避免这类问题办法是分别写出(1)创建Widget,(2)将它置入只能指针内吗,最后传入processWidget函数内
std::shared_ptr<Widget> pw(new Widget);// 在单独语句内以只能指针
processWidget(pw, priority());