• 《Effective C++》——条款17:以独立语句将newed对象置入智能指针


    假设有如下两个函数:

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

    对processWidget的调用如下:

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

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

    • 执行"new Widget"表达式
    • 调用tr1::shared_ptr构造函数

    于是在调用processWidget之前,编译器必须创建代码,做以下三件事:

    • 调用priority
    • 执行"new Widget"
    • 调用tr1::shared_ptr构造函数

    C++编译器以什么样的次序完成这些事情弹性很大。可以确定的是"new Widget"一定执行于tr1::shared_ptr构造函数被调动之前。如果编译器选择第二顺位执行它,最终获得这样的操作序列:

    1. 执行“new Widget”
    2. 调用priority
    3. 调用tr1::shared_ptr构造函数

    一旦对priority的调用导致异常,“new Widget”返回的指针将会遗失,从而导致内存泄露。

    避免这类问题的办法是使用分离语句:分别写出(1)创建Widget,(2)将它置入一个智能指针内,然后再把那个智能指针传给processWidget(因为编译器对“跨越语句的各项操作”没有重新排列的自由):

    std::tr1::shared_ptr<Widget>pw(new Widget);
    processWidget(pw, priority());
  • 相关阅读:
    正则表达式的与或非
    正则中需要转义的符号
    HTTP 错误状态码讯息
    HTTP协议详解
    TCP/IP、Http、Socket的区别
    CSS样式中标点符号的作用
    HighCharts: 设置时间图x轴的宽度
    可以尝试用Google Font API来摆脱网页字体的单调 仅仅抛砖引玉
    Oracle 权限(grant、revoke)
    网站加上图标
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4654870.html
Copyright © 2020-2023  润新知