侧边栏壁纸
博主头像
如此肤浅

但行好事,莫问前程!

  • 累计撰写 52 篇文章
  • 累计创建 6 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

条款17 以独立语句将newed对象置入智能指针

如此肤浅
2022-05-23 / 0 评论 / 0 点赞 / 35 阅读 / 778 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-27,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1. 以独立语句将 newed 对象存储于(置入)智能指针内。如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄漏。

问题描述

假设我们有个函数用来揭示处理程序的优先权,另一个函数用来在某动态分配所得的 Widget 上进行某些带有优先权的处理:

int priority();
void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);

现 processWidget 决定对其动态分配得来的 Widget 运用智能指针:

processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());

虽然此处对资源进行了管理,但调用时仍可能出现资源泄露!

产生问题的原因

  • 在调用 processWidget 函数之前需要做3件事:
    ① 调用 priority;
    ② 执行 “new Widget”;
    ③ 调用 tr1::shared_ptr 构造函数。

  • 在 C++ 编译器执行这3个操作时弹性较大,能肯定的是 ② 一定会在 ③ 之前执行,至于操作 ① 是第几个执行则不确定。 假设现在的执行顺序是:
    ① 执行 “new Widget”;
    ② 调用 priority;
    ③ 调用 tr1::shared_ptr 构造函数。

万一对 priority 的调用导致异常,在此情况“new Widget”返回的指针将会遗失,因为它还未被放入 tr1::shared_ptr 内。

解决方式

避免这类问题的办法很简单:使用分离语句,分别写出(1)创建 Widget;(2)将它置入一个智能指针内,然后再把那个智能指针传给 processWidget。

std::tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority()); // 此时该调用动作则不会导致泄露
0

评论区