C11标准中的四个智能指针:
- auto_ptr (已弃用)
- unique_ptr
- shared_ptr
- weak_ptr
auto_ptr
构造函数与析构函数
int* p = new int(0);
auto_ptr<int> ap(p);
1.两个auto_ptr,不能同时拥有一个对象。(会重复删除)
int *p =new int (0);
auto_ptr<int> ap1(p);
auto_ptr2<int>ap2(2);
/*因为ap1与ap2都认为指针p是归它管的,
在析构时都试图删除p,
两次删除同一个对象的行为在C++标准中是未定义的。
所以我们必须防止这样使用auto_ ptr。*/
2.不能用auto_ptr 管理数组指针。(析构是delete,不是delete[])
String *p = new String[10];
auto_ptr<String> ap(p);
3.构造函数的explicit关键词有效阻止从一个“裸”指针隐式转换成auto_ ptr 类型。
拷贝构造与赋值
1.因为一个auto_ ptr 被拷贝或被赋值后,其已经失去对原对象的所有权,这个时候,对这个auto_ ptr 的提领(dereference )操作是不安全的。
如下:
int * p= new int(0);
auto_ ptr<int> ap1(p);
auto_ ptr<int> ap2 = ap1;
cout<< *ap1;//错误, 此时ap1 已失去对p指针的拥有权,
2.auto_ptr 不具有值语义,所以不能被用在STL标准容器中。
3.提领操作(dereference)
提领操作有两个操作,一个是返回其所拥有的对象的引用,另一个则是实现了通过auto_ptr 调用其所拥有的对象的成员。
如:
class Base
{
void fun() {};
}
auto_ _ptr<A> ap (new Base());
(*ap). fun();
ap->fun( );
4.辅助函数
- get用来显式的返回auto_ ptr 所拥有的对象指针。我们可以发现,标准库提供的auto_ ptr 既不提供从裸指针至
auto ptr 的隐式转换(构造函数为explicit),也不提供从auto_ _ptr 到"裸"指针的隐式转换,从使用上来讲可能不那么的灵
活,考虑到其所带来的安全性还是值得的。 - release ,用来转移所有权。
- reset,用来接收所有权,如果接收所有权的auto_ ptr 如果已经拥有某对象,必须先释放该对象。
5使用auto_ ptr 的注意事项
(1) auto ptr不能指向数组
(2) auto_ ptr 不能共享所有权
(3) auto ptr 不能通过复制操作来初始化
(4) auto ptr 不能放入容器中使用
(5) auto _ptr 不能作为容器的成员
图论