zoukankan      html  css  js  c++  java
  • 改善程序与设计的55个具体做法 day6

    条款13:以对象管理资源

    资源,包括但不限于内存、句柄、GDI对象、数据库连接等。

    内存要记得释放,句柄要记得closehandle, GDI对象要记得删除,数据库连接要记得关闭,等等等等。

    以对象来管理这些资源就是利用 对象的构造和析构 特性,在构造函数中获得资源并在析构函数中释放资源。

    两个智能指针auto_ptr 和 std::tr1::shared_ptr,前者同一时刻只能指向同一个资源,赋值的一方不再指向这个资源,被赋值的一方指向这个资源。在析构函数中对对象调用delete(而不是delete[])。

    shared_ptr利用引用计数,多个指针可以指向同一个对象,当引用技术为0时,对对象调用delete(而不是delete[])。

    条款14:在资源管理类中小心copying行为

    这个比较好理解,管理资源的对象的copying行为(拷贝构造 和 operator=)一定要谨慎

    a 必要的时候可以不允许其对外界有copying行为

    b 对其管理的底层资源使用饮用计数机制(比如 shared_ptr)

    c 复制其管理的底部资源(深拷贝)

    d 转移其惯例的底部资源的拥有权(比如 auto_ptr)

    条款15:在资源管理类中提供对原始资源的访问

    原始资源 也就是上一条款中提到的 底部资源。

    a 显式转换

      Pointer Get() const;  提供get函数

    b 隐式转换

       operator 类型(){return m_ptr; }             提供类型转换函数

    条款16:成对使用new 和 delete 时要采取相同形式

    即 new - delete,  new [] - delete[]

    这样做到原因是new[] 会在内存中记录个数,当delete[]的时候会去这(几)个内存单元读取该个数,然后按照该个数去释放(析构)内存。

    如果是 new [] - delete,则可能会造成资源泄漏, 如果是 new - delete[] 则可能会导致未定义的问题。

    条款17:以独立语句将newed 对象置于智能指针

    这句话乍读有点绕口,其实代码写出来很简单。

    e.g.

    void Func(std::tr1::shared_ptr<CObject> ptr, int a)

    调用时, Func(std::tr1::shared_ptr<CObject>(new CObject), GetA()), 由于参数的调用顺序和编译器的优化问题,可能会产生如下顺序的(伪)代码:

    new CObject;

    GetA();

    std::tr1::shared_ptr<CObject>(指针)

    当GetA的调用产生异常时,可能导致执行不到第三行,这样CObject对象就不会被释放了,从而造成内存泄漏。

    所以本条款要说的是:

    std::tr1::shared_ptr<CObject> ptr(new CObject);

    Func(ptr, GetA);

       

  • 相关阅读:
    搜索专题
    KMP专题
    CSU 1326: The contest(分组背包)
    强连通专题
    MST:Bad Cowtractors(POJ 2377)
    MST:Agri-Net(POJ 1258)
    ShortestPath:Layout(POJ 3169)(差分约束的应用)
    MST:Conscription(POJ 3723)
    MST:Roadblocks(POJ 3255)
    DP:Space Elevator(POJ 2392)
  • 原文地址:https://www.cnblogs.com/cuish/p/5922180.html
Copyright © 2011-2022 走看看