- share_ptr的构造函数是explict的
void processWidget(std::shared_ptr<Widget> pw, int priority); processWidget(new Widget, priority());// 错误,因为shared_ptr构造函数是explict的,所以无法将 new Widget转换为shared_ptr<Widget>(new Widget) processWidget(std::shared_ptr<Widget>(new Widget), priority()); // 正确
- processWidget(std::shared_ptr<Widget>(new Widget), priority());隐藏的问题
- 调用 processWidget(std::shared_ptr<Widget>(new Widget), priority());调用顺序是这样的:new Widget--->priority()--->shared_ptr<Widget>(new Widget)
- 不一定100%按照上述顺序,但需要考虑可能会这样
- 如果在调用priority()程序跑出异常,那么new Widget分配的内存可能永远不会在被调用造成内存泄漏
- 解决这种异常很简单:以独立语句将new出来的对象置入智能指针
std::shared_ptr<Widget>p1 (new Widget); processWidget(p1, priority());