一:了解c++中的内存
通常把内存理解为四个部分:栈,堆,全局/静态存储区和常量存储区
①栈:通常是局部变量,函数参数等的存储区,在编译期间就大小确定的存储区,大小为1MB。
②堆:通常是在编译期间不能确定大小的存储区,就如动态内存分配(原先不知道到底要分配多少的空间),一般由malloc/new来分配,free/delete来释放,两个紧挨着的指针,内存那不一定是紧挨着的。
③全局/静态存储区:在编译期间就确定大小的变量的存储区,用于在整个运行期间都可见的全局变量和静态变量
④常量存储区:编译期间就确定大小的常量的存储区,全局可见,只不过里面存储的是常量,不能被修改。
二 智能指针(定义在memory头文件)
①标准库提供两种智能指针:shared_ptr与unique_ptr。
shared_ptr允许多个指针指向一个对象,而unique_ptr独享一个对象
②还有一种weak_ptr的弱引用,指向shared_ptr所指向的对象。
③shared_ptr类
定义的格式:
shared_ptr<int>p1; // p1是一个shared_ptr,可以指向一个int 类型的对象
shared_ptr<list<int>>p2; // p2是一个shared_ptr,可以指向int的list
**默认初始化的智能指针中保存着一个空指针。
④下面介绍几种不常见的操作(shared_ptr独有的)
make_shared<T>(args) // 返回一个shared_ptr,指向一个动态分配的类型为T的对象,使用args初始化此对象
shared_ptr<T>p(q) //p是q的拷贝,此操作递增p的计数器,递减q的计数器,前提是两者之间的指针类型能相互转换
p.unique() //若p.use_count()为1,返回true,否则返回false
p.use_count() //返回与p共享对象的智能指针的数量
⑤make_shared函数(定义在memory头文件)
它的作用是安全的在动态内存中分配一个对象,并返回一个指向该对象的shared_ptr智能指针
格式为:
shared_ptr<int>p3=make_shared<int>(42); //在指向一个值为42的int的shared_ptr
shared_ptr<string>p4=make_shared<string>(10,'9'); //指向一个值为‘9999999999’的string
shared_ptr<int>p5=make_shared<int>();指向一个值初始化为0的Int
一个更简单的格式为:auto p6=make_shared<vector<string>>();//p6指向一个动态分配的空vector<string>。
⑥shared_ptr的拷贝与赋值
每个shared_ptr 都有一个关联的计数器,通常称为引用计数,拷贝一个shared_ptr,该计数器递增;给shared_ptr附一个新值或者销毁它,就会递减。一旦shared_ptr的计数器变为0,它就会自动释放自己所管理的对象,并释放内存。