Effective C++ 第三章
目录
- 3. Resource Management 资源管理
- 13: Use objects to manage resources
- 14: Think carefully about copying behavior in resource-managing classes.
- 15: Provide access to raw resources in resource-managing classes.
- 16: Use the same form in corresponding uses of new and delete.
- 17: Store newed objects in smart pointers in standalone statement.
3. Resource Management 资源管理
13: Use objects to manage resources
以对象管理资源
不能依赖于函数中总会执行到delete语句释放资源,而应该在控制流离开函数时被释放
-
auto_ptr是一个类指针对象,其析构函数对所指的对象自动调用delete
使用auto_ptr要避免多个指针指向同一个对象
-
auto_ptr 的复制操作会将源对象置为null
-
shared_ptr的复制行为与普通指针一致
14: Think carefully about copying behavior in resource-managing classes.
在资源管理类中小心coping行为
- 抑制coping
- 引用计数法
15: Provide access to raw resources in resource-managing classes.
在资源管理类中提供对原始资源的访问
-
auto_ptr/shared_ptr提供了get成员函数,获取智能指针内部的原始(类型)指针
-
重载了-> 和 *操作符,支持 p->func()和 (*p).func()对函数的调用
-
RAII(Resource Acquisition Is Initialization)提供 显式转换函数get返回
-
隐式转换:客户使用比较方便
class Font { public: ... operator FontHandle() const { return f;} private: FontHandle f; // 原始字体资源 } // 调用时直接传参 Font,隐式转化为 FontHandle
16: Use the same form in corresponding uses of new and delete.
成对使用new和delete时要采取相同形式
string * stringPtr1 = new string;
string * stringPtr2 = new string[100];
...
delete stringPtr1; // 删除一个对象
delete [ ] stringPtr2; // 删除一个由对象组成的数组
使用typedef
注意申请的是一个对象还是对象数组
typedef string AddressLines[4];
string * pal = new AddressLines;
// 正确的delete:
delete [] pal;
17: Store newed objects in smart pointers in standalone statement.
以独立语句将newed对象置入智能指针
假设有优先权的处理:
// 函数声明
int priority();
void processWidget(shared_ptr<Widget> pw, int priority);
// 调用
processWidget(shared_ptr<Widget> (new Widget), priority());
第一个实参的执行有两个步骤
- 执行 new Widget
- 调用shared_ptr构造函数
编译器生成的执行序列可能为:
- 执行 new Widget
- 调用priority
- 调用shared_ptr构造函数
第二步抛出异常,第一步返回的指针将会遗失,第三步无法获得指针管理的资源,引发资源泄露问题