【问题标题】:C++ std::shared_ptr assigning via operator=C++ std::shared_ptr 通过 operator= 赋值
【发布时间】:2013-09-11 10:33:46
【问题描述】:

我有一些参数化类,其指针私有成员实现为std::shared_ptr。事实上,这个指针是一个指向参数化(模板)结构的指针。还有一个方法返回相同的指针。但没有包裹在std::shared_ptr 中。它看起来像这样:

template<typename SomeType> class SomeClass{
    private:
        std::shared_ptr<SomeStruct<SomeType>> ptr;         // pointer
        SomeStruct<SomeType>* someMethod(...);             // method
};

在我的某个班级方法中,我希望有以下任务:

ptr = someMethod(..);

正确吗?事实上,我希望这个方法在需要时分配内存,然后这个指针由shared_ptr 管理。我收到一个错误,指出未找到正确的 operator=。我应该首先在我的方法中包装最近分配的对象的指针吗?

【问题讨论】:

  • 你可以用构造函数包装它,或者更简单,用“make_shared”进行分配
  • 从不返回原始指针,返回智能指针。如果函数的用户执行delete call_to_function_which_returns_pointer() 并且该函数是工厂会发生什么?
  • 另请注意,return-raw-pointer 函数接口并没有清楚地显示返回对象(Pointed by)的所有权。 Herb Sutter 写了一篇关于这个的 GoTW,但我没有找到。
  • @Manu343726 这也是私有方法的规则吗? (这个方法实际上是私有的)。
  • 可能不会,因为您在内部管理数据。 但是使用智能指针更容易不用担心指针的生命周期/所有权。所以总是使用智能指针,它们让你的生活更轻松

标签: c++ pointers c++11 stl shared-ptr


【解决方案1】:

除了永远不会返回原始指针的非常真实的评论之外,您还有(至少)三个选项:

  • 返回std::shared_ptr(每次调用都会更新引用计数)
  • 返回对 std::shared_ptr 的 (const) 引用(以避免在某些情况下产生引用计数的开销)
  • std::enable_shared_from_this 派生类。如果您确实需要返回一个指向对象的普通指针(或引用),请将此作为最后的手段。然后使用ptr = someMethod(...)-&gt;shared_from_this();

【讨论】:

    【解决方案2】:

    这是不正确的,会导致两个独立的shared_ptr指向同一个对象,这样会导致双重删除:

    SomeStruct<SomeType>* raw_ptr = someMethod(..);
    ptr p1(raw_ptr);
    ptr p2(raw_ptr);
    

    你想要的是enable_shared_from_this。这将与对象一起分配外部引用计数,以便所有构造的共享指针使用相同的引用计数。

    【讨论】:

    • 其实这个方法是私有的,如果当前指针只指向NULL,就会分配新的对象。它看起来像:ptr = someMethod(ptr, .. )
    • @vard: 所以 .. SomeClass 是单身人士?
    • @Lightness 不,我在示例中没有列出所有方法和成员。 someMethod 在公共方法之一中被调用。
    猜你喜欢
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2019-06-13
    相关资源
    最近更新 更多