将auto_ptr转换为shared_ptr

时间:2012-05-24 16:20:14

标签: c++ shared-ptr smart-pointers auto-ptr

如何将std :: auto_ptr更改为boost :: shared_ptr?这是我的限制: 1.我使用的是API类,我们只需要调用它来返回这些指针 2.我需要在auto_only中使用该调用 3.我的语义涉及共享,所以我需要使用shared_ptr) 4.在课堂上,only_auto operator =是私有的,以防止应对 5.此外,必须通过克隆调用std :: auto_ptr creat_only_auto()创建only_auto对象;

我知道模板显式shared_ptr(std :: auto_ptr& r);但是我如何在这种情况下使用它?

超简化代码示例:

    #include <iostream>
    #include <memory>
    #include <boost/shared_ptr.hpp>

    using namespace std;

    class only_auto
    {
      public:
      static auto_ptr<only_auto> create_only_auto();
      void func1();
      void func2();
      //and lots more functionality

      private:
      only_auto& operator = (const only_auto& src);
    };

    class sharing_is_good : public only_auto
    {
      static boost::shared_ptr<only_auto> create_only_auto()
      {
        return boost::shared_ptr (only_auto::create_only_auto()); //not the correct call but ...
      }

    };

    int main ()
    {
       sharing_is_good x;

       x.func1();
    }

3 个答案:

答案 0 :(得分:4)

shared_ptr构造函数声明为:

template<class Other>
shared_ptr(auto_ptr<Other>& ap);

请注意,它采用非const左值引用。它这样做是为了能够正确地释放auto_ptr对象的所有权。

因为它需要一个非const左值引用,你不能用rvalue调用这个成员函数,这正是你想要做的:

return boost::shared_ptr(only_auto::create_only_auto());

您需要将only_auto::create_only_auto()的结果存储在变量中,然后将该变量传递给shared_ptr构造函数:

std::auto_ptr<only_auto> p(only_auto::create_only_auto());
return boost::shared_ptr<only_auto>(p);

答案 1 :(得分:1)

  

3. My semantics involves sharing so I do need to use a shared_ptr)

auto_ptr的大多数有效用法都与std :: unique_ptr源兼容,因此您可能希望查看转换为该内容。如果一切顺利,那么你就安全了。 (如果你还没有使用typedef,你可能希望以后可以轻松更改类型。)如果你有编译错误,你的代码中可能有一个错误,你之前使用的是无效的auto_ptr的。

我认为你应该只在使用unique_ptr验证事物后转向std :: shared_ptr并且你确实需要共享所有权(通常你可以使用唯一的所有权和非拥有指针)。

答案 2 :(得分:0)

我认为

return boost::shared_ptr<only_auto>(only_auto::create_only_auto().release());

应该做的伎俩