【问题标题】:shared, weak and lazy pointers in C++C++ 中的共享、弱指针和惰性指针
【发布时间】:2012-01-11 20:20:24
【问题描述】:

有人知道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. 无法控制不同线程上的对象构造

如果您能指出解决这些问题的其他尝试,或者该领域可能正在进行的任何工作,我将不胜感激。

【问题讨论】:

  • 听起来很像shared_ptr<boost::optional<T>>,对吗?
  • @user1078210 或许你可以找到更多信息here
  • @GMan: boost::optional 确实 允许延迟构造,但boost::shared_ptr 也允许这样做,所以两者都不需要,如果我理解你的话。
  • @DrewDormann:不完全是。不同的是,在 optional 初始化时,所有的shared_ptr 都指向了初始化的对象。
  • @GMan:没错。我没有想到那种情况。

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


【解决方案1】:

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

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。如果您想区分“尚未构建”和“已销毁”,您可以在工厂运行后设置一个布尔值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    • 1970-01-01
    相关资源
    最近更新 更多