- auto_ptr :
- 不允许隐式构造
- 不能将同一个裸指针赋值给多个智能指针
- 允许拷贝构造和赋值构造,当进行拷贝构造或者赋值构造时,会将原智能指针置空
- 清楚资源直接delete
- unique_ptr:
- 不允许隐式构造
- 不能将同一个裸指针赋值给多个智能指针
- 不允许普通拷贝构造和赋值构造
- 允许对即将死亡的对象做拷贝构造和赋值构造
- 清除资源调用deleter(删除器)
- shared_ptr
- 不允许隐士构造
- 不能将同一个裸指针赋值给多个智能指针
- 允许并且可以进行拷贝构造和等号运算符重载
- weak_ptr
- 无效智能指针
- 只能使用share_ptr进行构造
- 弱智能指针不能直接使用,必须转成强智能指针
- 弱智能指针升级为强智能指针必须要求对应的强智能指针存活
- 若智能指针只保存强智能指针,不占用引用计数
#include
#include
using namespace std;
unique_ptr fun(unique_ptr &ptr)
{
cout <<*ptr< (new int(*ptr));//对即将死亡的对象做拷贝构造
}
void autoPtrTest()
{
int *p=new int(33);
// auto_ptr aptr=p,报错,auto_ptr不允许隐式构造
auto_ptr aptr(p);//auto_ptr后无需delete p ,因为auto_ptr会自动释放内存
// auto_ptr aptr2(aptr);//此时如果用aptr拷贝构造或者赋值构造一个aptr2,那么aptr将会被析构掉
cout << aptr.get()< uptr(p);
// unique_ptr uptr2(p);//不允许重复构造同一指针
unique_ptr uptr2;
uptr.get();
uptr.reset();
uptr.release();
//uptr.swap();//交换两个智能指针
uptr.get_deleter();//析构资源
if(uptr)//智能指针判断是否为空
{
cout<<"uptrbu不为空"< sptr(p);
/
sptr.get();
//sptr.swap();
sptr.reset();
sptr.use_count();//指针被引用次数
sptr.unique();//判断引用次数是否为1
// sptr[];//有[]运算符
shared_ptr sptr1(p);
shared_ptr sptr2( sptr1);
shared_ptr sptr3=sptr2;
sptr2.reset();
cout <<*sptr<< "n"<<*sptr1<<"n"<<"n"<<*sptr3< sptr(p);
weak_ptr wptr(sptr);
// cout<< *wptr< wptr1=sptr;//允许隐式构造
wptr.use_count();
wptr.reset();
shared_ptr sptr1( wptr);//弱智能指针提升为强智能指针
cout<< *sptr1<