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;
}

auto_ptr和unique_ptr

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有对应的数组重载版本。

auto_ptr和unique_ptr

第一行代码会提示没有和参数列表匹配的构造函数。

4.auto_ptr不支持自定义删除器,关于删除器,具体可以看上一篇博文。