资源管理
# 资源管理, Resource Management
# Item 13:以对象管理资源 Use objects to manage resources.
用对象的形式管理资源 (RAII, Resource Acquisition Is Initialization),所以要特别注意构造和析构函数,在使用对象的时候可以使用shared_ptr之类的智能指针来管理每个对象的实例;
- 返回没有加工的指针, 容易造成资源泄露, 忘记delete
- 手动释放资源, 可能会跑不到释放的那个地方, 也有可能造成double release;
- 不要多个auto_ptr()指向同一个对象, 不然对象可能会被多次删除, 程序就会有未定义行为;
- 使用factory设计模式来供给需要的Invest对象
- copy assignment要让原来的指针变成null
- 使用reference counting smart pointer, 使用shared_ptr() 相关的实现;
# Item 14:在资源管理类中小心copying行为 Think carefully about copyingbehavior in resource-managing classes.
虽然都是RAII原则, 但是要特别注意拷贝构造的行为,
- 一些复制行为明显是没有意义, 不合理的, 书里面用linux中的mutex的lock和unlock函数来举例子, 这个时候要禁止复制的行为;--> uncopyable(陈硕muduo库里面, 好像也有类似的指定操作), 或者把这些copy assignment设为private或者=delete
- 底层资源使用reference-count的方式;
- 要清楚自己做的是深拷贝还是浅拷贝,要确保自己是在做深拷贝, 不仅拷贝指针, 也拷贝指针所指的内存块;
- 有时候拷贝其实是一种转移, 要确保系统中给目前只有这一个对象, 从一个地方转移到另外一个地方--> auto_ptr, shared_ptr(), 对这些指针的内部构造要很熟悉。【rebuild the auto ptr code demo】
- 自动生成的拷贝函数不一定能够满足需求;
# Item 15:在资源管理类中提供对原始资源的访问 Provide access to raw resources in resource-managing classes.
资源管理类中, 提供对原始资源的访问接口, 例如x.get, get_instance这种接口, 让类有接口返回内部资源
返回数字,
返回一个instance
singleton的设计模式是怎么做的?
factory模式是怎么做的?
操作符重载, 这是一种隐式转换的方法, 客户使用起来比较方便,但是显示转换会比较安全(使用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.
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.
要保证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