zoukankan      html  css  js  c++  java
  • effective C++ 条款 17:以独立语句将newed对象置入智能指针

    假设一个函数用来揭示处理程序的优先权

    int priority();

    另一个函数用来在动态分配的Widget上进行某些带有优先权的处理:

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

    考虑调用processWidget:

    processWidget(new Widget, priority());

    上面这种调用不能通过编译,std::tr1::shared_ptr构造函数需要一个原始指针,但是,这个构造函数是explicit构造函数,无法进行隐式转换。

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

    上面虽然可以通过编译,但却仍然可能泄露资源。

    编译器产出一个processWidget调用之前,必须先核算即将被传递的各个实参。第一个实参有两部分组成:

    1.执行“new Widget”表达式。

    2.调用tr1::shared_ptr构造函数。

    第二个实参是调用priority函数。

    c++编译器以什么次序完成这些事情,弹性很大,但是“new Widget”一定在tr1::shared_ptr之前,因为new Widget的结果还要被传递作为tr1::shared_ptr构造函数的一个实参。但对priority的调用可能排在第一或第二或第三。如果编译器选择第二顺位执行它:

    1.执行“new Widget”

    2。调用“priority()”

    2.调用tr1::shared_ptr构造函数

    万一对priority的调用导致异常,会发生什么事情?new Widget返回的指针将会遗。因为它尚未置入tr1::shared_ptr中。而后者是我们期盼用来防卫资源泄漏的武器。

    避免这类问题的办法很简单:使用分离语句:

    std::tr1::shared_ptr<Widget> pw(new Widget);//在单独语句内以智能指针存储newed所得对象
    processWidget(pw, priority());

    编译器对于“跨越语句的各项操作”没有重新排列的自由(只有在语句内才有那个自由度)。

  • 相关阅读:
    vector.clear()无法释放内存的对策
    www.wangtam.com
    VC 控件的字体控制 若将字体设置成“宋体、仿宋—GB2312、隶书、幼圆”中的某一字体时,需将lfCharSet设置成GB2312—CHARSET才使设置的字体有效
    CPU使用率 武胜
    MySQL数据类型 转 武胜
    按小时统计的语句 转 武胜
    MYSQL 行转成列 转 武胜
    推荐一个 开源C#股票软件 武胜
    WCF传输泛型 List 对象 转 武胜
    WCF 传输大数据的问题 转 武胜
  • 原文地址:https://www.cnblogs.com/lidan/p/2323517.html
Copyright © 2011-2022 走看看