Effective C++ 第三章

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构造函数
    第二步抛出异常,第一步返回的指针将会遗失,第三步无法获得指针管理的资源,引发资源泄露问题
posted @ 2020-09-11 23:53  izcat  阅读(221)  评论(0编辑  收藏  举报