智能指针:智能指针也是模版,在头文件<memory>中
shared_ptr:允许多个指针指向同一个对象。shared_ptr<string> p; 可以指向string类型的智能指针。会自动销毁所管理的对象,还会自动释放相关联的内存。
unique_ptr:独占所指向的对象。
weak_ptr:是一种弱引用,指向shared_ptr所管理的对象。*/
shared_ptr<int> sp;
unique_ptr<int> up;
智能指针的操作
p.get:返回p中保存的指针,若智能指针释放了其对象,返回的指针所指向的对象也消失
p.awap(q):交换p和q中的指针
p.unique:若p.use_count为1,则返回true,否则返回false。shared_ptr独有操作
p.use_count:返回与p共像对象的智能指针数量。shared_ptr独有操作
make_shared:在动态内存中分配一个对象并初始化它,返回值指向此对象的shared_ptr*/
shared_ptr<int> sp1 = make_shared<int>(77);
auto sp2 = make_shared<vector<string>>();
shared_ptr自动销毁所管理的对象,当指向一个对象的最后一个shared_ptr被销毁时,shared_ptr会自动销毁此对象。
是通过析构函数实现的,当引用计数为0时销毁,还会自动释放相关联的内存。
直接管理内存
使用new动态分配和初始化对象int* p = new int;//可以初始化也可以不初始化
动态分配的const对象,const int* p = new const int(1024);
内存耗尽,返回空指针
动态释放内存,delete p;
指针和delete,不是释放非new创建的内存,不能将相同指针值多次释放
动态对象的生存期直到被释放时为止
delete之后重置指针值,提供有限的保护。delete p; p = nullptr;
shared_ptr和new的结合
不要混合使用普通指针和智能指针
不要使用get初始化另一个智能指针或为智能指针赋值*/
unique_ptr操作
u.release:u放弃对指针的控制全,赶回指针,并将u置空
u.reset:释放u指向的对象
u.reset(q):如果提供了内置指针q,令u指向这个对象,否则置为空
unique_ptr不支持普通的拷贝或赋值操作
当定义一个unique_ptr时,需要将其绑定到一个new返回的指针上
unique_ptr<string> unp1(new string("asfg"));
unique_ptr<string> unp2(p1);//错误 unique_ptr不支持拷贝
unique_ptr<string> unp3;
unp3 = unp1;// 错误 unique_ptr不支持赋值
weak_ptr操作
weak_ptr是一种部控制所指向对象生存期的智能指针
w.reset():将w置为空
w.use_count:与w共享对象的shared_ptr的数量
w.expired:若use_count为0返回true,否则返回false
w.lock:如果expired为true,返回一个空shared_ptr,否则返回一个指向w的对象的shared_ptr
weak_ptr是一种不控制所指向对象的生存期的智能指针,它指向一个shared_ptr管理的对象。
将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数,
就是最后的shared_ptr被销毁,即使有weak_ptr指向该对象,也会被销毁。