Effective C++ 3 资源管理 条款13-条款17

Effective C++系列文章:

Effective C++ 1自己习惯C++ 条款01-条款04
Effective C++ 2 构造/析构/赋值运算 条款5-条款12
Effective C++ 3 资源管理 条款13-条款17
Effective C++ 4 设计与声明 条款18-条款25
Effective C++ 5 实现 条款26-条款31
Effective C++ 6 继承与面向对象设计 条款32-条款40
Effective C++ 7 模板与泛型编程 条款41-条款52
Effective C++ 8 杂项讨论 条款53-条款55

条款13 以对象管理资源

  1. 获取资源后立即放进管理对象内
  2. 管理对象运用析构函数确保资源被释放
    通过将资源放在对象中,在控制流离开f()时,该对象的析构函数就会自动释放这些资源(析构函数自动调用机制)

方案设计:

  1. 使用智能指针auto_ptr避免f函数潜在的资源泄露的可能性,其析构函数自动对其所指对象调用delete
    通过拷贝构造或者拷贝赋值操作符复制auto_ptr,他们就会变成null,这是为了防止多个智能指针指向同一个对象。
void f(){
	//pInv指向createInvestment返回物
	std::auto_ptr<Investment> pInv(createInvestment());
	std::auto_ptr<Investment> pInv2(pInv);//pInv2指向对象,pInv设为null
	pInv=pInv2;//pInv指向对象,pInv2设为null//调用factory函数,一如既往的使用pInv经由atuo_ptr的析构函数自动删除pInv
}
  1. 智能指针导致正常拷贝行为无法进行,使用“引用计数型智能指针”RCSP(类似垃圾回收),持续追踪共有多个对象指向某笔资源,并在无人指向时自动删除该资源,但是无法解决环状引用。
void f(){
	…
	std::trl::shared_ptr<Investment> pInv(createInvestment());//同上
	…
	std::trl::shared_ptr<Investment>  pInv2(pInv);//指向同一对象
}
//pInv和pInv2被销毁,它们指向的对象也被自动销毁
问题:这两个智能指针都是使用delete,而没有使用delete[]。
  1. 不是所有资源都是heap_based(基于堆),这时需要自己建立自己的资源管理类。

条款14 在资源管理中小心coping行为

void lock(Mutex * pm);//锁定pm所指的互斥器
void unlock(Mutex * pm);//将互斥器接触锁定
class Lock{
public:
    explicit Lock(Mutex * pm):mutexPtr(pm){
        lock(mutexPtr);//获取资源
    }
    ~Lock(){
        unLock(mutexPtr);//释放资源
    }
private:
    Mutex * mutexPtr;
}

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

使用智能指针的问题:在我们对资源管理时有时候需要一个get方法,但是使用智能指针trl::shared_ptr的类型是trl::shared_ptr,而我们实际使用的时候可能需要的是Investment *类型的指针。
APIs往往要求访问原始资源,所以每一个RAII calss应该提供一个“取得其所管理之资源”的办法
对原始资源的访问呢可能经由显式转换或者隐式转换,一般而言显式转换比较安全,但是隐式转换对用户比较方便。

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

两种不同的内存布局:
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这三个的调用顺序是不确定的,虽然可以确定是new Widget一定在trl::shared_ptr之前完成,但是如果最终的执行顺序是这样的:
在这里插入图片描述
在执行2的过程中发生异常,new Widget返回的指针将会遗失,因为它尚未被植入trl::shared_ptr中,这就可能发生内存泄漏(没有放在对象中管理资源)。
解决方案:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值