6

我有由shared_ptrs 组成的对象结构,加上weak_ptrs 以避免循环。原始指针是不行的,因为boost::serialization在通过对象跟踪作为序列化时间进行反序列化时,需要恢复共享指针和弱指针。对象生命周期模式很复杂(粒子模拟),但完全可以预测。每当我使用weak_ptr::lock()时,我确信指针仍然有效。通常,lock().get()我只在很短的时间内需要该对象。

现在,lock().get()具有性能影响,因为它会增加共享计数(in lock()),然后很快就会减少它(临时shared_ptr被破坏)。

这个2002 年的 boost.devel 帖子说,在weak_ptr开发过程中,直接访问原始指针的功能被考虑(命名为unsafe_getor leak),但从未进入实际实现。它的缺失迫使程序员在给定条件下使用次优接口。

现在,问题是如何模拟unsafe_get/ leak,换句话说,从 获取原始指针weak_ptr,程序员的风险无效,只读取(不写入)数据。我可以想象一些技巧,比如找出内部原始指针的偏移量shared_ptr或类似的东西可以完成这项工作。

我正在使用boost::shared_ptr,但该解决方案也适用于 c++11 std::shared_ptr

4

2 回答 2

5

既然你要求一个便携式黑客。

在boost 的 weak_ptr.hpp中发现的一个有趣的代码部分是:

template<class T> class weak_ptr
{
  ...

public:

  ...

// Tasteless as this may seem, making all members public allows member templates
// to work in the absence of member template friends. (Matthew Langston)

#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS

private:

    template<class Y> friend class weak_ptr;
    template<class Y> friend class shared_ptr;

#endif

    element_type * px;            // contained pointer
    boost::detail::weak_count pn; // reference counter

};  // weak_ptr

这意味着如果您使用该BOOST_NO_MEMBER_TEMPLATE_FRIENDS选项编译 boost,您将公开访问pxweak_ptr 的成员,该成员似乎是指向元素类型的原始指针。

于 2014-11-06T10:03:00.230 回答
3

我建议您简单地同时持有 aweak_ptr和原始指针,并在您知道这样做安全时直接使用原始指针作为优化。weak_ptr如果您愿意,您可以将相关的原始指针包装在一个具有 的类中unsafe_get

于 2014-11-06T09:52:07.920 回答