auto_ptr
int *pint=new int (10);
auto_ptr<int>ap (pint);
1可以托管一段堆空间
2进行复制时有缺陷 :auto_ptr<int>ap2(ap),此时会将ap的数据成员置为空
原因:auto_ptr的拷贝函数列表初始化时使用release()函数将传进来的对象置空。
unique_ptr
1不允许进行复制或者赋值操作,独享对象所有权。没有了auto_ptr的缺陷
2具有移动语义(std::move),可以作为容器元素。vector<unique_ptr<int>>vec;
进行传值时使用std::move,就不会执行拷贝操作。参数是显式调用构造函数产生的临时对象是也可以作为容器右值。
原因:从源码可以看出unique_ptr具有移动构造函数和移动赋值运算符函数。
shared_ptr
1支持复制拷贝,但是浅拷贝,用的是引用计数,不同指针指向同一片堆空间时,把数目记录下来。
2 uniqe_ptr使用的一般shared_ptr也可以使用
3具有移动语义,可以复制赋值
缺点:循环引用,强引用,++操作。解决:赋值复制时不进行++
weak_ptr
1引用计数不会++;