zoukankan      html  css  js  c++  java
  • 《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());
  • 相关阅读:
    day01-h1字体大小和文本居中
    js正则表达式中的
    js滚动分页原理
    在web.xml中设置全局编码
    C# 导出word 表格代码
    C# 创建单例
    Winform 异步调用2 时间
    Winform 异步调用
    c#中跨线程调用windows窗体控件
    C# 中的委托和事件
  • 原文地址:https://www.cnblogs.com/happygirl-zjj/p/4654870.html
Copyright © 2011-2022 走看看