智能指针
本章节参考C++11中的智能指针,进行整理得到。
C++11引入了智能指针,包括:
unique_ptr
:独占指针对象,指针和指针所指对象的生命周期一致,且指针所指对象不能被其他指针共享。shared_ptr
:可共享指针对象,可以赋值给其他shared_ptr
或weak_ptr
指针。当所有与对象相关联的shared_ptr
型指针生命周期结束时,该对象的生命周期也结束。weak_ptr
:该指针不能决定所指对象的生命周期,引用所指对象时,需要lock()
成shared_ptr
才能使用。
示例:
// 独占指针
unique_ptr<int> up1(new int(11));
// 独占指针不能被用于赋值
unique_ptr<int> up2 = up1; // ERROR.
// 独占指针可以转交控制权,自身失去控制权变为空指针。
unique_ptr<int> up3 = move(up1); // CORRECT.
// 独占指针的释放,相应的对应也会被释放。
up3.reset()
// 共享指针
shared_ptr<string> sp1(make_shared<string>("Hello"));
// 共享指针可以用于赋值其他shared_ptr或weak_ptr.
shared_ptr<string> sp2 = sp1;
// 当一个shared_ptr释放时,如果存在至少一个其他shared_ptr共享其所指对象,则所指对象不被释放;若不存在shared_ptr指向所指对象,那么所指对象也被释放。
sp1.reset()
cout << *sp2 << endl; // CORRECT.
// 弱指针,可以接受共享指针的赋值
weak_ptr<string> wp = sp2;
// 引用弱指针所指对象时,需要使用lock()
cout << *wp.lock() << endl; // CORRECT.
// 当弱指针所指对象相关联的所有shared_ptr都被释放时,所指对象也被释放,弱指针不能引用所指对象
sp2.reset();
cout << *wp.lock() << endl; // ERROR.
shared_ptr
和weak_ptr
的工作原理:
它们并不直接指向所指对象,而是指向一个ptr_manage
的对象。该对象包含两部分,一部分记录shared_ref_count
和weak_ref_count
,分别表示引用它的shared_ptr
和weak_ptr
的个数;另一部分的ptr
存放真正的所指对象的指针地址。
数据容器
list
vector
deque
特点:
- 动态空间;
- 头端和尾端都可以执行插入和删除操作;
array
特点:
- 静态空间固定大小;