1.智能指针
为了说明智能指针,先要说明RAII范式,Resource Acquisition Is Initialization(RAII),中文译为**资源获取即初始化,**是 C++ 里非常重要的编程范式(就是思想)
在早期的时候,人们想要在heap上申请内存,必须手动申请手动释放,但是这种操作非常危险,因为一旦忘记释放,或者提前释放,就会导致内存泄漏或者程序崩溃,因此C++提出了一种解决方法:由于栈(stack)上对象的管理是自动的,而堆上内存是手动的,把栈上对象与堆上内存绑定,实现了让栈上对象去管理堆上资源。这样就变得非常可靠了。
总的来说构造函数里拿资源,析构函数里释放资源。对象活着,资源就活着;对象死了,资源自动释放。这里的资源就是指堆上的资源。
RAII 会把文件、内存、锁、线程、socket、数据库连接等资源的生命周期绑定到对象生命周期上
实现的方式是**智能指针,**智能指针有三种
#include <momory.h>
shared_ptr :共享资源指针对象
unique_ptr : 独享资源指针对象
weak_ptr :弱指针,特点是指向同一对象use_conunt不计数,用于解决"循环引用"
配合shared_ptr使用
(ps:裸指针/原始指针指的都是普通指针,意思就是手动创建手动释放的指针,而野指针就是没有初始化的原始指针,里面指向一个随机的地址,非常危险)
智能指针是通过 " use_count() 引用计数 " 实现对象的自动delate的,智能指针p有个函数 p.use_count 可以知道现在有几个 shared_ptr 正在共同管理同一个"堆上资源"。当p.use_count = 0时,堆上资源才会被释放。
创建智能指针方式:用make_shared最好
auto p = std::make_shared<int>(10) ;
2.堆创建
T* p = new T() 这里的()仅仅代表调用T的构建函数。
所以有std::shared_ptr<T> p ( new T() ) 这种写法,这里意思是创建一个T *p,并且为他malloc一个动态内存
然后因此诞生了一个更短的写法
auto p = std::make_shared<int>(10); //更好
<==> std::shared_ptr<int> p ( int(10) );
3.shared_ptr和uniqe_ptr区别
shared可以有多个主人 unqie不行


4.map映射

5.Template模板
分为函数模板,这里<typename T> 和 <class T> 没区别

和类模板(像Vector动态数组,智能指针这些都是,不想多说)

6.Vector动态数组
std::vector<int> packet;
1. packet={10 ,10,10};
2. packet.push_back(20); // {10 ,10,10,20}放到最后
3. printf ( packet.size() ) //打印元素个数4个
相关其他操作:
后面自己再学吧
6."深/浅"拷贝
先要了解 "拷贝构造函数" ,作用是 :用已有对象 创建一个新对象。


一般这个拷贝构造函数不写的话,系统默认会写有一个,就是Person P2 = P1 就会调用,但是他只会复制一些普通的值,一旦遇到什么指针,继续用默认的拷贝构造函数,会导致指针指向同一个资源,这有可能导致野指针。
因此为了全面复制拷贝,出现了"深拷贝"的概念。实现原理就是自写"拷贝构造函数"
