AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
## 条款17:以独立语句将 newed 对象置入智能指针 Store newed objects in smart pointers in standalone statements. 假设有以下两个接口: ```cpp int priority(); void processWidget(std::tr1::shared_ptr<Widget> pw, int priority); ``` 如果使用不当,会导致内存泄漏: ```cpp processWidget(std::tr1::shared_ptr<Widget> (new Widget), priority()); ``` 这行代码可以通过编译,但在编译器产出一个 `processWidget` 调用码之前,会先核实即将被传递的各个实参。第二个实参只是单纯的对 `priority` 函数的调用,但第一个实参由两部分组成: * 执行 `new Widget` 表达式; * 调用 `tr1::shared_ptr` 构造函数; 于是在调用 `processWidget` 之前,编译器必须创建代码,做以下三件事情: * 调用 `priority` ; * 执行 `new Widget` ; * 调用 `tr1::shared_ptr` 构造函数; 但是这三件事的执行顺序没有被明确定义,如果最终获得这样的操作序列: 1. 执行 `new Widget` ; 2. 调用 `priority` ; 3. 调用 `tr1::shared_ptr` 构造函数; 这种情况下,如果在调用 `priority` 函数时导致异常,此时 `new Widget` 返回的指针将会遗失,这会导致资源泄漏。所以为了避免这类问题,应该分离语句(1)创建 Widget(2)再将它置入一个智能指针,最后再传入 `processWidget` 函数。