一个非常弱的参考(不能变成共享)

时间:2013-12-03 07:54:32

标签: c++ shared-ptr weak-references

我想知道是否有任何智能指针类型概念实现了“非常弱的参考”的想法。

这基本上是一个weak_ptr,但不能变成shared_ptr,基本上,当你有very_weak_refs时,你确定强引用计数可以永远不会上去。

这将允许管理员更好地“强烈拥有”内存,并且在野外提供非常弱的引用仍然允许客户端通过.lock_get()函数或等效函数使用良好的旧原始指针来访问数据。 。(名称旨在反映您通常会做.lock().get()的事情。)

您对数据没有相同的安全性,因为您的对象在使用时可能会被销毁,但如果您的环境受到足够的控制,以至于您知道管理员在处理过程中无法清理其数据,那么在null_ptr之后检查lock_get()后,仍然可以在本地使用原始指针。

你们中是否有人想要类似的事情,更多信息/情报/想法? 感谢。

理由:背后的动机是weak_ptr具有可转换为共享的“安全缺陷”,因此,在分布式的弱引用之后,你基本上做的不同于分发共享的那些,因为任何人都可以保持非常长期共享的数据引用有效地阻止了被强制执行的实体(经理)的正确清理。

这是由非常弱的引用解决的,当您在管理器的公共界面中分发这类对象时,您确信当您删除上次共享引用时,您的数据将被删除。

对我来说,弱引用的整个概念只适用于表现良好的客户;谁知道他们应该在很短的时间内将他们的弱参考推广到共享。

2 个答案:

答案 0 :(得分:1)

不幸的是,使用智能指针的传统界面,你所要求的是不可能的。

问题是终身问题。 weak_ptr不能用于直接访问对象,因为它不能保证所述对象的存活时间足够长:对象可能是从你的脚下拉出来的。

示例:

int main() {
    std::shared_ptr<int> sp(new int(4));
    std::weak_ptr<int> wp(sp);

    if (not wp.expired()) {
        sp.reset();
        std::cout << *wp << "\n"; // Access WP ? But there is nothing there!
    }
}

因此,无论好坏,除了在实际需要访问对象的同时从弱指针恢复共享指针时,没有其他选择而不控制此访问的持续时间


然而,最后一点是我们的线索。一个简单的想法是自己编写一个行为良好的weak_ptr客户端,并改变它允许外部世界访问数据的方式。例如:

template <typename T>
class very_weak_ptr {
public:
    very_weak_ptr() {}

    explicit very_weak_ptr(std::weak_ptr<T> wp): _wp(wp) {}

    template <typename F>
    void apply(F&& f) {
        std::shared_ptr<T> sp = _wp.lock();
        f(sp.get());
    }

private:
    std::weak_ptr<T> _wp;
}; // class very_weak_ptr

注意:还有一个漏洞,enable_shared_from_this允许从std::shared_ptr<T>的实例中恢复T;您可以在T上添加编译时检查,以防止此类与此类对象一起使用。

答案 1 :(得分:0)

您要求的功能相当于,从std::shared_ptr<>开始:

  • 最初创建一个std::weakptr<> + .get()-一个原始指针,
  • 在使用原始指针之前,检查weak_ptr<>还没有.expired()
  

你们中是否有人想要类似的事情,更多信息/情报/想法?感谢。

否......如果您还需要检查weak_ptr<>.expired(),您也可以获得有效的shared_ptr<>。您认为这将实现什么目标?当你以某种方式知道/要求经理在你使用原始指针期间无法释放对象时,“更好”强有力的所有权“ - 不会加起来....