C ++中的共享,弱和懒惰指针

时间:2011-12-02 20:54:05

标签: c++ shared-ptr lazy-initialization weak-ptr

是否有人了解shared_ptrweak_ptr与懒惰初始化合作伙伴的实现?课程的要求是:

  • 一个lazy_ptr类,允许客户端稍后构建对象(如果有的话),而不需要构造函数实现

  • 一个weak_lazy_ptr类,它有三种可能的状态:尚未构造(不会锁定到shared_ptr),构造(将锁定到shared_ptr)并销毁(不会锁定shared_ptr

我创建了一些在之前完全没有完成工作的类(see CVu article here),它们在实现中使用了shared_ptrweak_ptr。使用共享和弱指针而不是与它们集成的模型的主要问题如下:

  1. 一旦所有lazy_ptr个对象超出范围,即使其他客户端持有shared_ptr个版本,也无法再锁定任何弱引用

  2. 无法控制不同线程上对象的构造

  3. 我很欣赏其他任何协调这些问题的尝试,或者对这方面可能正在进行的任何工作的建议。

1 个答案:

答案 0 :(得分:2)

创建不需要参数的延迟构造:

boost::bind( boost::factory<T*>(), param1, param2 )将创建一个函数对象,该对象在构造时不需要参数即可执行等效的new T(param1, param2)

创建支持此延迟构造的shared_ptr:

使用标准boost::shared_ptr(例如,在您的创作类中)捆绑您的工厂,并且您将获得所描述的结果,包括相应的weak_ptr功能......

无论什么代码触发客户端的延迟构造都应运行:

your_shared_ptr.reset( your_factory() );

无论什么代码触发对象的销毁都应该运行:

your_shared_ptr.reset();

只有在对象的生命周期内,共享指针才会传播到true。如果你想要将“尚未构建”与“已销毁”区分开来,可以在工厂运行后设置一个bool。