auto_ptr和unique_ptr
auto_ptr是老版本的智能指针,当时还没有unique_ptr,shared_ptr,weak_ptr,现在auto_ptr已经被废弃,他有了更好用的替代品unique_ptr,相对于他的后继者,它有以下几个缺点。
1.auto_ptr可以进行赋值和拷贝运算,但是他虽然名义上做的是赋值和拷贝,但是背后做的却是move语义做的事情,拷贝和赋值之后,源对象被置位空,这看起来十分反常。而unique_ptr只支持移动语义,使用起来更加清晰。
int main()
{
auto_ptr<int>ap1(new int(5)),ap2;
cout<<ap1.get()<<endl;
cout<<ap2.get()<<endl;
ap2=ap1;
cout<<ap1.get()<<endl;
cout<<ap2.get()<<endl;
unique_ptr<int>up1(new int(5)),up2;
cout<<up1.get()<<endl;
cout<<up2.get()<<endl;
up2=move(up1);
//up2=up1; 报错
cout<<up1.get()<<endl;
cout<<up2.get()<<endl;
}
2.auto_ptr无法作为容器元素。因为想作为STL的容器元素需要“拷贝和赋值操作之后,有两个独立的相等的对象”,显然auto_ptr
的拷贝和赋值不满足这个条件。但为什么unique_ptr就可以呢?网上查到的是因为它支持移动语义,具体的原因还没有搞清楚。
int main()
{
/*
vector<auto_ptr<int>>v;
for(int i=0;i<10;i++)
{
auto_ptr<int>temp(new int (5));
v.push_back(temp);
}
*/
vector<unique_ptr<int>>v;
for(int i=0;i<10;i++)
{
unique_ptr<int>temp(new int(5));
v.push_back(move(temp));
}
}
这段代码的前半部分是过不了编译的。
3.auto_ptr不能指向动态数组,也就是说他不支持用delete[]删除所指对象,而unique_ptr有对应的数组重载版本。
第一行代码会提示没有和参数列表匹配的构造函数。
4.auto_ptr不支持自定义删除器,关于删除器,具体可以看上一篇博文。