使用C ++将指针传递给auto_ptr

时间:2011-02-10 18:12:46

标签: c++ auto-ptr

我有一个执行此操作的功能:

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

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

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

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

  

无法转换第一个参数   从MyClass *到std :: auto_ptr&lt; _Ty&gt;

为什么呢?感谢您的帮助

编辑1 正如所问,myparams类型是正常的,但也有一个T param,因为该函数在模板类中

3 个答案:

答案 0 :(得分:9)

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

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

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

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

答案 1 :(得分:0)

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

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

请注意,在调用MyFunction2后,分配的memoty将被销毁,因为临时auto_ptr将会消失,并将其解除分配。

答案 2 :(得分:0)

您可能想要像这样调用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将指向已删除的对象。