我有由shared_ptr
s 组成的对象结构,加上weak_ptr
s 以避免循环。原始指针是不行的,因为boost::serialization
在通过对象跟踪作为序列化时间进行反序列化时,需要恢复共享指针和弱指针。对象生命周期模式很复杂(粒子模拟),但完全可以预测。每当我使用weak_ptr::lock()
时,我确信指针仍然有效。通常,lock().get()
我只在很短的时间内需要该对象。
现在,lock().get()
具有性能影响,因为它会增加共享计数(in lock()
),然后很快就会减少它(临时shared_ptr
被破坏)。
这个2002 年的 boost.devel 帖子说,在weak_ptr
开发过程中,直接访问原始指针的功能被考虑(命名为unsafe_get
or leak
),但从未进入实际实现。它的缺失迫使程序员在给定条件下使用次优接口。
现在,问题是如何模拟unsafe_get
/ leak
,换句话说,从 获取原始指针weak_ptr
,程序员的风险无效,只读取(不写入)数据。我可以想象一些技巧,比如找出内部原始指针的偏移量shared_ptr
或类似的东西可以完成这项工作。
我正在使用boost::shared_ptr
,但该解决方案也适用于 c++11 std::shared_ptr
。