Modern c++ design 第七章

Smart Points:一个C++ classs, 在语法和某些语义上模拟一般指针,以提供更多功能, 比如std::auto_ptr. 本章介绍的内容就是介绍smart points的各种问题,以及如何写一个smart points.
实现smart points, 必须要实现operator*, operator->这两个操作符, 以及value语义, 即拷贝赋值和构造。
首先考虑smart points 需要存储的数据, 一般情况之需要存储类型的指针, 但是一些特别的情况下, 也可能需要存储一个类似指针行为的其他句柄、引用或者包装类。 loki地实现将存储方式定义为一个策略。
其次考虑拥有权的问题, 拥有权即哪一个对象负责指针的资源, 有很多策略, 比如深层copy, 就是每次赋值都重新clone新的资源。 这里需要注意的是, 在多态情况下,深层copy很容易造成切割现象, 需要利用一个虚函数clone的方法来避免, 这种策略不是很好。 临写copy策略, 当改写的时候复制资源,  c++不能区分const成员函数和非const函数的调用, 因此这种策略也不太好实现, 但是在特定的条件下可以成为一个不错的策略。 引用计数,  最有名也是使用最多的一种拥有权策略, 通过引用计数来控制资源, 当引用计数为0的时候删除资源。 引用链接, 用循环链表来记录使用当前资源的实体, 当无人使用时,删掉资源。 摧毁式拷贝, 如std::auto_prt, 当赋值得时候, 取消源对象的拥有权。

介绍了几种实现smart pointer的问题:
1。 Address-of操作符  这种需求很容易实现, 重载单元operator& ()就可以了, 但是这个操作符概念非常重要, 很多泛型代码都假定, &T就是T*, 但是重载了operator&, 就丧失了这个概念。  所以不应该提倡address-of
2. 隐式转换到原始指针  即operator T*(). 但是这样就可以显示释放sp的资源, 比如SmartPtr<Something> sp; delete sp; 也可以通过。 不过可以通过提供另一个转换operator void*()来使上述代码不能编译通过。 不过可以转换的策略确实会使得代码不太安全,值得权衡。
3. 判等问题, 次序比较问题: 是否实现和普通指针相同的判等, 次序比较, 为了实现这个需求, 需要定义很多操作符, 而且会出现一些微妙的问题。

文章还介绍了两个smart pointer的策略, 检测和多线程。 为了实现多线程, 多线程和所有权这两个策略之间通常绞缠过多, 需要合并。 而检测策略需要在存储策略的基础上进行。
最后,将这些策略组合起来,就是smart pointers的定义。
template <typename T,
template <class> class OwnershipPolicy = RefCounted,
class ConversionPolicy = DisallowConversion,
template <class> class CheckingPolicy = AssertCheck,
template <class> class StoratePolicy = DefaultSPStorate>
class SmartPtr;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值