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

    1. 有些智能指针类(比如shared_ptr<T>)不支持隐式类型转换,假设存在这样两个函数:

    void fun(shared_ptr<int> lhs,int rhs);
    int foo();
    View Code

    那么对于以下函数调用:

    fun(new int,foo());

    将不能通过编译,解决方法之一:

    fun(shared_ptr<int>(new int),foo());

    它共有三个步骤:执行new int;构造shared_ptr<int>,调用foo(),但是由于编译器对于同一语句的各项操作具有重新排列的自由,因此除了执行new int肯定在构造shared_ptr<int>之前外,调用foo(),可以发生在任何阶段,可能在最前,中间,最后,如果是按:执行new int→调用foo()→构造shared_ptr<int>的顺序执行,那么如果foo()发生异常,就会在shared_ptr<int>构造之前造成内存泄露.

    2. 对于1出现的问题,可以利用编译器对于"跨越语句的各项操作"没有重新排列的权力,以独立语句将newed对象置入智能指针,如下:

    shared_ptr<int> ptr(new int);
    fun(ptr,foo);
    View Code

    这样可以防止由于foo在new出的int被放入shared_ptr<int>之前抛出异常而导致内存泄露,但要注意:

    ptr不是临时对象,也就是说调用fun后ptr管理的内存没有被释放,而ptr的存在并不是为了要访问底层资源,而是为了防止出现异常而造成内存泄露存在的,所以如果不需要ptr所指向的内存,最好调用reset()将它释放.(个人认为这个条款有些鸡肋)

  • 相关阅读:
    Spring源码分析(一)
    keras默认配置
    keras中常用的初始化器
    keras手写数字识别
    tensorflow实现XOR
    sklearn PCA的使用
    git常用操作
    Microsoft Visual C++ 14.0 is required问题解决
    TensorFlow2.0提示Cannot find reference 'keras' in __init__.py
    线性回归处理非数值型数据
  • 原文地址:https://www.cnblogs.com/reasno/p/4752523.html
Copyright © 2011-2022 走看看