zoukankan      html  css  js  c++  java
  • [Effective C++ --017]以独立语句将newed对象置入智能指针

    这一节也比较简单,先假设我们有如下的函数:

    int foo();
    void memFoo(shared_ptr<T> pw, int foo);

    现在假设我们要调用memFoo函数:

    memFoo(new W, foo());

    但是这样写编译是通不过的,我们可以改造为:

    memFoo(shared_ptr<p>(new W), foo());

    这样编译就没有问题了,但是却可能出现内存泄露问题,为什么呢?

    因为编译器在产出一个memFoo调用码之前,必须先核对即将被传递的各个实参,即在调用memFoo()之前,编译器必须做3件事

    1.调用foo()函数

    2.执行"new W"

    3.调用shared_ptr构造函数

    问题就出在这三个的调用顺序上,C++并不能保证上面3个步骤总是按照1~3的顺序来完成的。如果出现以下的顺序

    1.执行"new W"

    2.调用foo()函数

    3.调用shared_ptr构造函数

    在2的时候,foo如果返回了错误,抛出异常,那么1中申请的内存将无处释放,导致泄露。

    要解决这个问题也比较简单,我们可以挨步来进行调用操作。

    shared_ptr<p> pw(new  W);     // 用智能指针存储newed对象
    memFoo(w, foo());

    ◆总结

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

  • 相关阅读:
    string的sizeof
    计算程序运行时间
    sleep所在头文件
    Mysql复制表结构、表数据
    UIView属性
    UITextView
    UITextField属性
    UISwitch属性
    UISlide属性
    UISegment属性
  • 原文地址:https://www.cnblogs.com/hustcser/p/4103745.html
Copyright © 2011-2022 走看看