【问题标题】:shared ptr castingshared_ptr 铸造
【发布时间】:2011-02-26 11:11:08
【问题描述】:
class Object { };
Class Derived : public Object { };

boost::shared_ptr<Object> mObject(new Derived); // Ok

但是如何将其转换为boost::shared_ptr&lt;Derived&gt;

我尝试了类似:static_cast&lt; boost::shared_ptr&lt;Derived&gt; &gt;(mObject),但失败了。

唯一可行的想法是:

boost::shared_ptr&lt;Derived&gt; res(new dynamic_cast&lt;Derived*&gt;(mObject.get()))

【问题讨论】:

标签: c++ boost casting shared-ptr


【解决方案1】:

不要将转换结果传递给新的 shared_ptr 构造函数。这将导致两个 shared_ptrs 认为他们拥有该对象,并且都将尝试删除它。结果将是双重释放,并且可能会崩溃。

shared_ptr 有 cast functions 专门为此。

【讨论】:

  • shared_ptrs 不会单独“拥有”任何东西。但是,您的建议是正确的,每个 shared_ptr 都不会知道对方在所有权声明中拥有份额。
【解决方案2】:

你可以试试

class Object { };
Class Derived : public Object { };

boost::shared_ptr<Object> mObject = new Derived; // OK
boost::shared_ptr<Derived> mDerived = 
    boost::static_pointer_cast<Derived, Object>(mObject); // OK

Boost 有相应的模板来满足 c++ 中定义的标准转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-16
    • 2011-09-17
    • 2011-03-16
    相关资源
    最近更新 更多