gpt4 book ai didi

c++ - 从 weak_ptr 泄漏原始指针的可移植 hack

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:24:05 27 4
gpt4 key购买 nike

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

现在,lock().get() 对性能有影响,因为它会增加共享计数(在 lock() 中),然后在不久之后减少它(临时 shared_ptr 被破坏)。

boost.devel post从 2002 年开始,在开发 weak_ptr 时,考虑了直接访问原始指针的功能(命名为 unsafe_getleak)但是从未进入实际实现。它的缺失迫使程序员在给定条件下使用次优接口(interface)。

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

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

最佳答案

既然你要求一个可移植黑客。

boost's 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,您将公开访问 weak_ptr 的成员 px,这似乎是指向元素类型的原始指针.

关于c++ - 从 weak_ptr 泄漏原始指针的可移植 hack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775800/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com