#include<iostream>
#include<memory>
using namespace std;
class Widget{
};
int priority(){//优先级处理
return 1;
}
void processWidget(shared_ptr<Widget>pw, int priority){
}
int main(){
//------------------------
//processWidget(new Widget, priority());//1 智能指针的构造为explicit不支持隐式转换
//----------------------
//processWidget(shared_ptr<Widget>(new Widget), priority());
/*上面全用了对象管理式资源 在调用仍可能泄漏资源原因如下 :
1 首先编译器产生调用码之前 必须首先核算各个实参
1.1 priority()函数的调用
1.2 shared_ptr<Widget>(new Widget> 分两步,new Widget
1.3 调用shared_ptr构造函数
c++编译器是以什么样的次序完成上面三步? 弹性很大。。。java和C#总是以特定次序完成函数参数的核算
假设:2 1 3 的次序执行,并且 1 在调用时导致异常会发生什么??
恩,new出来的指针将会遗失
解决:为了避免上述情况发生 是以独立语句将new对象存置入智能指针内
*/
//--------------
shared_ptr<Widget>pw(new Widget);
processWidget(pw, priority());
system("pause");
return 0;
}
条款17 以独立语句将new对象置入智能指针
最新推荐文章于 2024-01-03 22:25:00 发布