0

我有以下示例代码:

#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()

为什么被a破坏后被foo()调用?

我不明白的另一件事是,如果我通过foo引用传递参数,a调用后不会被破坏foo()

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

4

3 回答 3

6

auto_ptr复制时窃取所有权。当您复制它时,副本现在包含指向对象的指针,而原始的则不包含任何内容。

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

于 2013-11-03T13:01:21.970 回答
2

auto_ptr 具有转移所有权的语义。如果您按值传递它,那么所有权将转移到一个临时对象,当然,该对象在离开范围时将被销毁。

于 2013-11-03T13:01:15.970 回答
1

std::auto_ptr 通常不是人们所期望的,这个想法是它是一个更安全的概念,因为一旦对象超出范围,ptr 就会被清除。因此,即使在多次返回/抛出异常等情况下,您的“新 A”也不会泄露。

但是,正如您所展示的,它也很容易导致非法内存访问,因为共享单个指针的两个 auto_ptrs 是灾难的根源。

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

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

所有这些都是 c++11 标准库的一部分,或者可以通过 boost 库获得。

于 2013-11-03T13:12:53.163 回答