本文主要是介绍条款17:以独立语句将 new出来的对象置入智能指针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
假设有一个函数来处理优先级,还有一个函数根据优先级对动态分配的Widget进行一些处理:
int priority();
void processWidget(std::shared_ptr<Widget> pw, int priority);
processWidget(new Widget, priority()); //错误,参数类型不匹配
processWidget(std::shared_ptr<Widget>(new Widget), priority());//正确
在调用processWidget之前,编译器必须生成代码来做以下三件事:
- 调用priority函数。
- 执行“new Widget”。
- 调用shared_ptr的构造函数。
由于编译器的不同,语句的调用顺序可能不同,可能出现的情况:
- 执行“new Widget”。
- 调用priority函数。
- 调用shared_ptr的构造函数
如果在执行priority函数出现异常,由于我们已经进行动态内存分配了,而且该内存并没有进行管理,所以泄露了。
避免这种问题的方法很简单:使用一个单独的语句创建Widget并将其存储在一个智能指针中,然后将智能指针传递给processWidget:
std::shared_ptr<Widget> pw(new Widget); // 在独立语句中,//将新对象存储在智能指针中
processWidget(pw, priority()); // 这个调用不会发生泄漏
在独立语句中将新对象存储在智能指针中。如果不这样做,在抛出异常时可能会导致微妙的资源泄漏。
这篇关于条款17:以独立语句将 new出来的对象置入智能指针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!