1ms Faster
Home
  • Program

    • Lean in C++
  • Perfromance Engineering

    • [>>>>>]
  • Reading Note

    • [>>>>>]
  • ComputeArch

    • [_]
  • Compiler

    • [_]
  • System

    • [_]
Authoring
  • Categories
  • Tags
GitHub (opens new window)

Quincy Jet

We are.
Home
  • Program

    • Lean in C++
  • Perfromance Engineering

    • [>>>>>]
  • Reading Note

    • [>>>>>]
  • ComputeArch

    • [_]
  • Compiler

    • [_]
  • System

    • [_]
Authoring
  • Categories
  • Tags
GitHub (opens new window)
  • Lean in c++

  • Performance Engineering

  • Misc

  • Reading Notes

    • Effective C++

      • 习惯C++
      • 构造,析构, 和重载赋值运算符
      • 资源管理
      • 设计与声明
      • 实现Implementations
      • 继承与OOP
      • 模板,Templates and GP
      • 定制new和delete
      • 杂项, Misc
    • More Effective C++

    • 《C++ 性能优化指南》
  • Wiki
  • Reading Notes
  • Effective C++
Quincy Jet
2022-06-27
Content

资源管理

# 资源管理, Resource Management

# Item 13:以对象管理资源 Use objects to manage resources.

  1. 用对象的形式管理资源 (RAII, Resource Acquisition Is Initialization),所以要特别注意构造和析构函数,在使用对象的时候可以使用shared_ptr之类的智能指针来管理每个对象的实例;

    1. 返回没有加工的指针, 容易造成资源泄露, 忘记delete
    2. 手动释放资源, 可能会跑不到释放的那个地方, 也有可能造成double release;
    3. 不要多个auto_ptr()指向同一个对象, 不然对象可能会被多次删除, 程序就会有未定义行为;
    4. 使用factory设计模式来供给需要的Invest对象
    5. copy assignment要让原来的指针变成null
    6. 使用reference counting smart pointer, 使用shared_ptr() 相关的实现;

# Item 14:在资源管理类中小心copying行为 Think carefully about copyingbehavior in resource-managing classes.

  1. 虽然都是RAII原则, 但是要特别注意拷贝构造的行为,

    1. 一些复制行为明显是没有意义, 不合理的, 书里面用linux中的mutex的lock和unlock函数来举例子, 这个时候要禁止复制的行为;--> uncopyable(陈硕muduo库里面, 好像也有类似的指定操作), 或者把这些copy assignment设为private或者=delete
    2. 底层资源使用reference-count的方式;
    3. 要清楚自己做的是深拷贝还是浅拷贝,要确保自己是在做深拷贝, 不仅拷贝指针, 也拷贝指针所指的内存块;
    4. 有时候拷贝其实是一种转移, 要确保系统中给目前只有这一个对象, 从一个地方转移到另外一个地方--> auto_ptr, shared_ptr(), 对这些指针的内部构造要很熟悉。【rebuild the auto ptr code demo】
    5. 自动生成的拷贝函数不一定能够满足需求;

# Item 15:在资源管理类中提供对原始资源的访问 Provide access to raw resources in resource-managing classes.

  1. 资源管理类中, 提供对原始资源的访问接口, 例如x.get, get_instance这种接口, 让类有接口返回内部资源

    1. 返回数字,

    2. 返回一个instance

    3. singleton的设计模式是怎么做的?

    4. factory模式是怎么做的?

    5. 操作符重载, 这是一种隐式转换的方法, 客户使用起来比较方便,但是显示转换会比较安全(使用xxxx.get()的模式)

      class Font{
      public:
          operator FontHandle() const { //也可以重载类型转换函数;
          	return f;
          }
      }
      
      1
      2
      3
      4
      5
      6

# Item 16:成对使用new和delete时要采取相同形式 Use the same form in corresponding uses of new and delete.

  1. new和delete使用的时候要成对使用, 并且注意区别数组和对象的delete

    std::string* stringPtr1 = new std::string;
    std::string* stringPtr2 = new std::string[100];
    
    delete stringPtr1; // 删除一个对象, 一个指针;
    delete [] stringPtr2; // 删除一个数组, 一块内存
    
    1
    2
    3
    4
    5
    • operator new, new operator的区别?
    • placement new / new placement区别?[Item 49之后有一些解释]

    # Item 17:以独立语句将newed对象置入智能指针 Store newed objects in smart pointers in standalone statements.

  2. 要保证new这个语句是单独执行的, 先于智能指针的赋值操作;

    processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority()); // 万一priority()这个函数抛出执行异常会怎样?
    
    // 用一个单独的语句来构造shared_ptr变量; 保证这行代码是单独执行的;
    std::tr1::shared_ptr<Widget> pw(new Widget);
    processWidget(pw, priority());
    
    1
    2
    3
    4
    5

#

构造,析构, 和重载赋值运算符
设计与声明

← 构造,析构, 和重载赋值运算符 设计与声明→

Copyright © 2017-2023 Quincy Jet | MIT License
  • Auto
  • Light
  • Dark
  • Read