知识卡片
置入前先托管资源
内容
把裸 new 的结果直接传给 emplace_back,资源管理对象可能直到容器节点分配后才构造;若中途分配抛异常,裸资源尚无拥有者负责释放。先用独立语句将资源交给智能指针,再移动进容器,可封闭这段异常窗口。置入省去临时对象的收益不能取代所有权安全。
参考来源
- 位置:《Effective Modern C++》第8章《微调》,条款四十二(源文件:_epub-src/EPUB/text/ch009.xhtml)
- 结论依据:原文比较先构造共享指针与直接转发裸指针,在容器节点分配失败时的释放路径不同,并给出先托管再转交方案。
- 原始内容:通过 new Widget 创建的原始指针完美转发给 emplace_back 中, list 节点被分配的位置。如果分配失败,还是抛出内存溢出异常。 当异常从 emplace_back 传播,原始指针是仅有的访问堆上 Widget 的途径,但是因为异常而丢失了,那个 Widget 的资源(以及任何它所拥有的资源)发生了泄漏。