美文网首页
Effective c++学习笔记(item15)

Effective c++学习笔记(item15)

作者: 懒生活 | 来源:发表于2021-10-23 11:35 被阅读0次

Effective c++学习笔记(item15)

item15: provide access to raw resources in resourcemanaging classes.

最理想的做法是获取资源后立即把资源初始化到资源管理类中。这样子可以避免绝大部分情况的泄露。推荐在获取资源后,后续的操作都是基于关联该资源的资源管理类进行。不推荐直接对原始的资源进行直接操作。但是有时候你不得不对原始资源进行操作。

需要对原始资源直接操作的情况,场景的伪代码如下:

调用别人的库获取资源 Src* pSrc = createSrc();
调用别人的库进行资源操作 int calcVal(Src *pSrc);
调用别人的库释放资源 releaseSrc(*pSrc);

好吧,这是别人开发好的,而且往往不允许你改动。不管再烂,你也不得不调用的东西。对方提供的全是原始资源的操作,那么我们在使用的时候,就要利用资源管理类首先避免资源泄露

调用别人的库获取资源 Src* pSrc = createSrc();
自己的操作:把pSrc初始化到智能指针对象中 shared_ptr<Src> srcManager(pSrc, releaseSrc);
调用别人的库进行资源操作 int calcVal(Src *pSrc);
//此时不能再调用别人的库释放资源 releaseSrc(*pSrc);

上面的代码不好,因为暴露了原始资源指针,pSrc, 极有可能导致维护者又调用一次releaseSrc(*pSrc); 比较理想的代码如下:

调用别人的库获取资源并立即放到资源管理类shared_ptr<Src> srcManager(createSrc());
调用别人的库进行资源操作 calcVal(srcManager.get());

从资源管理类获取原始资源的两种方式

  1. 通过智能指针的get函数,可以直接获取原始资源指针。
  2. 通过智能指针的运算符->获取原始资源
  3. 如果是自己设计的资源类,可以定义类似的get函数返回原始资源
  4. 如果是自己设计的资源累,也可以通过隐式转换函数来获取原始资源
    我个人不觉得隐式转换资源有多大好处。这个放在引申章节中描述。重点描述下隐式转换函数。

相关文章

网友评论

      本文标题:Effective c++学习笔记(item15)

      本文链接:https://www.haomeiwen.com/subject/eumkaltx.html