广州C/C++培训
达内广州岗顶中心

18087159764

热门课程

广州C++培训:所有权网络

  • 时间:2016-11-22
  • 发布:广州C++培训
  • 来源:达内新闻

广州C++培训:所有权网络

链表是资源管理分析中的一个很有意思的例子。如果你选择表成为链(link)的所有者的话,你会陷入实现递归的所有权。每一个link都是它的继承者的所有者,并且,相应的,余下的链表的所有者。下面是用smart pointer实现的一个表单元:

class Link

{

// ...

private

auto_ptr _next;

};

最好的方法是,将连接控制封装到一个弄构进行资源转换的类中。

对于双链表呢?安全的做法是指明一个方向,如forward:

class DoubleLink

{

// ...

private

DoubleLink *_prev;

auto_ptr _next;

};

注意不要创建环形链表。

这给我们带来了另外一个有趣的问题--资源管理可以处理环形的所有权吗?它可以,用一个mark-and-sweep的算法。这里是实现这种方法的一个例子:

template

class CyclPtr

{

public:

CyclPtr (T * p)

:_p (p), _isBeingDeleted (false)

{}

~CyclPtr ()

{

_isBeingDeleted = true;

if (!_p->IsBeingDeleted ())

delete _p;

}

void Set (T * p)

{

_p = p;

}

bool IsBeingDeleted () const { return _isBeingDeleted; }

private

T * _p;

bool _isBeingDeleted;

};

注意我们需要用class T来实现方法IsBeingDeleted,就像从CyclPtr继承。对特殊的所有权网络普通化是十分直接的。

将原有代码转换为资源管理代码

如果你是一个经验丰富的程序员,你一定会知道找资源的bug是一件浪费时间的痛苦的经历。我不必说服你和你的团队花费一点时间来熟悉资源管理是十分值得的。你可以立即开始用这个方法,无论你是在开始一个新项目或者是在一个项目的中期。转换不必立即全部完成。下面是步骤。

(1) 首先,在你的工程中建立基本的Strong Pointer。然后通过查找代码中的new来开始封装裸指针。

(2) 最先封装的是在过程中定义的临时指针。简单的将它们替换为auto_ptr并且删除相应的delete。如果一个指针在过程中没有被删除而是被返回,用auto_ptr替换并在返回前调用release方法。在你做第二次传递的时候,你需要处理对release的调用。注意,即使是在这点,你的代码也可能更加"精力充沛"--你会移出代码中潜在的资源泄漏问题。

(3) 下面是指向资源的裸指针。确保它们被独立的封装到auto_ptr中,或者在构造函数中分配在析构函数中释放。如果你有传递所有权的行为的话,需要调用release方法。如果你有容器所有对象,用Strong Pointers重新实现它们。

(4) 接下来,找到所有对release的方法调用并且尽力清除所有,如果一个release调用返回一个指针,将它修改传值返回一个auto_ptr。

(5) 重复着一过程,直到最后所有new和release的调用都在构造函数或者资源转换的时候发生。这样,你在你的代码中处理了资源泄漏的问题。对其他资源进行相似的操作。

(6) 你会发现资源管理清除了许多错误和异常处理带来的复杂性。不仅仅你的代码会变得精力充沛,它也会变得简单并容易维护。

上一篇:广州C++培训: 共享的所有权
下一篇:C++中动态内存分配引发问题的解决方案

零基础学编程,先来看策略与委托事件【广州达内】

达内程序员培训:微信小程序的商业价值

编程入门学什么?C/C++的地址那些事儿

达内程序员培训:一嘴一嘴啃Vue

选择城市和中心
贵州省

广西省

海南省

台湾