我有以下示例代码:
#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
的生命周期?
答案 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库提供。