【问题标题】:Pass pointer to auto_ptr with C++使用 C++ 传递指向 auto_ptr 的指针
【发布时间】:2011-06-25 01:29:40
【问题描述】:

我有一个功能可以做到这一点:

static MyClass* MyFunction(myparams)
{
    return new MyClass(myparams)
}

我可以在另一个具有以下签名的函数中调用此函数:

void MyFunction2(std::auto_ptr<MyClass> myparam)

但是当我尝试这样做时,我遇到了编译器错误:

无法转换第一个参数 从 MyClass * 到 std::auto_ptr<_ty>

为什么?感谢您的帮助

编辑 1 询问 myparams 类型是正常的,但还有一个 T 参数,因为该函数位于模板类中

【问题讨论】:

  • MyFunction 中myparams 的类型是什么,问题中没有。
  • 你明白auto_ptr的目的吗?
  • @Eric 我添加了 myparams 类型。 @Jefromi 是的,我知道 auto_ptr 让我不用考虑指针破坏和内存释放
  • 但是一旦对象超出范围,它就会自动销毁对象,从而避免了这种情况——这意味着如果存在隐式转换,您可能会遇到一些令人讨厌的意外。了解它的作用很重要。

标签: c++ auto-ptr


【解决方案1】:

您可能想像这样调用 MyFunction2 函数...

void f() {
    MyClass* directptr = MyFunction(myparams);
    std::auto_ptr<MyClass> p(directptr);
    MyFunction2(p);
    cout << p.get() << endl; // Prints NULL!
}

但是,当MyFunction2 结束时,MyClass 实例将被删除,而在返回时,p 将为 NULL,directptr 将指向已删除的对象。

【讨论】:

    【解决方案2】:

    std::auto_ptr&lt;&gt; 有一个显式构造函数,就像任何其他智能指针一样。这意味着没有从T*std::auto_ptr&lt;T&gt; 的隐式转换来防止意外删除对象。因此,您需要将原始指向的 std::auto_ptr&lt;&gt; 显式转换为:

    MyFunction2(std::auto_ptr<MyClass>(MyFunction()));
    

    让你的工厂函数返回一个智能指针而不是原始指针也是一个好主意,它让读者清楚地知道对象的所有权正在转移给调用者:

    static std::auto_ptr<MyClass> MyFunction(myparams)
    {
        return std::auto_ptr<MyClass>(new MyClass(myparams));
    }
    

    【讨论】:

      【解决方案3】:

      没有从原始指针到auto_ptr 的隐式转换。只需明确指出:

      MyFunction2(std::auto_ptr(MyFunction(params)));

      请注意,在调用MyFunction2 后,分配的内存将被销毁,因为临时的auto_ptr 将消失,释放它。

      【讨论】:

        猜你喜欢
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        • 1970-01-01
        • 2016-12-28
        • 2020-08-16
        相关资源
        最近更新 更多