c++中auto_ptr的疑惑
[code=C/C++][/code]
#include <iostream>
using namespace std;
class A{
public:
A(void){
cout<< "A 构造"<<endl;
}
~A(void){
cout<< "A 析构"<<endl;
}
void bar(void){
cout<<"bar 函数"<<endl;
}
};
/*
auto_ptr<class A> foo1(auto_ptr<class A> ptr){
cout<<"foo1函数"<<endl;
return ptr;
}*/ //这样写A只析构一次
A& foo2(auto_ptr<class A> ptr){
cout<<"foo2函数"<<endl;
return *ptr;
}
int main(void){
auto_ptr<class A> ptr(new A);
auto_ptr<class A> ptr1 = ptr;
ptr->bar();//这里ptr对A交出所有权了为什么还能访问呢
//auto_ptr<class A> pa = foo1(ptr1);
A p = foo2(ptr1);//这样最终导致析构两次
cout<<"主函数退出"<<endl;
return 0;
}
[解决办法]
调试看看是不是指针是不是空的
[解决办法]
很简单,你可以试试
((A*)NULL)->bar();
就知道了,
这里只是因为bar没有用到A里的数据,否则结果就完全不同了。
[解决办法]
关于析构一次 是因为只有一个A类型的对象
/*
auto_ptr<class A> foo1(auto_ptr<class A> ptr){
cout<<"foo1函数"<<endl;
return ptr;
}*/ //这样写A只析构一次
//auto_ptr<class A> pa = foo1(ptr1);
这里只是移交了所有权而已,只有一个A类型的对象,当然只有一次。
A p = foo2(ptr1);//这样最终导致析构两次
这里相当于调用了A的拷贝构造函数用foo2(ptr1)返回的对象 去初始化了p,p是一个新对象了。
在main函数退出的时候,会调用局部变量p的析构函数,ptr1的析构函数,ptr的析构函数。
其中ptr已经移交了new A()创建出来的对象给ptr1了,并把自己设置为空了。所以调用了两次A的析构函数,因为有两个A类型的对象。
[解决办法]
用boost::shared_ptr 来替代 auto_ptr
[解决办法]
参考:
使用auto_ptr需要注意的事项