std :: auto_ptr在按值传递给函数后变为无效

时间:2013-11-03 12:55:26

标签: c++ pass-by-reference auto-ptr

我有以下示例代码:

#include <iostream>
#include <auto_ptr.h>

class A
{
public:
    A(){ std::cout << "A ctor" << std::endl;}
    ~A() {std::cout << "A dtor" << std::endl;}
    void bar(){std::cout << "bar()" << std::endl;}
};

void foo(std::auto_ptr<A> a)
{
    std::cout << "foo()" << std::endl ;
}

int main()
{
    std::auto_ptr<A> a(new A());
    a->bar();
    return 0;
}

输出:

A ctor
bar()
A dtor

现在,如果我致电foo(a)a会在致电bar()之前被销毁:

int main()
{
    std::auto_ptr<A> a(new A());
    foo(a);
    a->bar();
    return 0;
}

输出:

A ctor
foo()
A dtor
bar()

为什么在调用afoo()被破坏?

我不明白的另一件事是,如果我通过引用将参数传递给foo,则在调用afoo()将不会被销毁:

void foo(std::auto_ptr<A> &a)
{
    std::cout << "foo()" << std::endl ;
}

int main()
{
    std::auto_ptr<A> a(new A());
    foo(a);
    a->bar();
    return 0;
}

输出:

A ctor
foo()
bar()
A dtor

如何通过引用传递影响auto_ptr的生命周期?

3 个答案:

答案 0 :(得分:6)

auto_ptr在复制时窃取所有权。复制时,副本现在保存指向对象的指针,原始文件不保留任何内容。

这也是一个弃用的概念。如果您有权访问C ++ 11,请改用unique_ptr

答案 1 :(得分:2)

auto_ptr具有转让所有权的语义。如果按值传递,则所有权将转移到临时对象,当然,当离开范围时,该对象将被销毁。

答案 2 :(得分:1)

std :: auto_ptr通常不是人们所期望的,因为它是一个更安全的概念,因为一旦对象超出范围,ptr就会被清除。所以你的新A&#34;即使在多次退货/异常抛出等情况下也不会泄露。

然而,正如您所示,它也很容易导致非法内存访问,因为共享单个指针的两个auto_ptrs是一个灾难的处方。

如果你只想要一个可以使用的ptr而不用担心发布,你应该使用unique_ptr。 unique_ptr无法复制。所以你可以传递它的引用,但不能复制它。

通常最有用的构造是shared_ptr,它允许多个所有者共享同一个ptr并确保在所有所有者超出范围时释放它。

所有这些都是c ++ 11标准库的一部分,或通过boost库提供。