12动态内存

12动态内存

每个程序分配有静态内存和栈内存,还有一个内存池称为自由空间或堆。用来存储动态分配。

12.1动态内存与只能指针

内存泄露:旺角是否内存;引用非法内存的指针:尚有指针引用内存却释放了。

智能指针:shared_ptr允许多个指针指向同一个对象,unique_ptr独占所指对象,weak_ptr弱引用指向shared_ptr。头文件memory。

12.1.1shard_ptr类

12动态内存_第1张图片

Make_shared函数

12动态内存_第2张图片

Shared_ptr有引用计数,拷贝或者利用其初始化或者传递给另一个函数或者作为函数返回值引用计数都会加1。给其赋新值,或是被销毁,或离开其作用域,计数器都会递减。计数器为0时,就会释放。还会释放相关联的内存。

12动态内存_第3张图片

12.1.2直接管理内存

12动态内存_第4张图片
12动态内存_第5张图片
12动态内存_第6张图片
12动态内存_第7张图片
12动态内存_第8张图片

Delete之后重置指针值

空悬指针,指针仍有但内存已经释放。

12.1.3shared_ptr和new结合使用

不能进行内置指针到智能指针间的隐式转换,必须使用直接初始化形式。

12动态内存_第9张图片
12动态内存_第10张图片

不要混合使用普通指针和智能指针,也不要使用get初始化另一个智能指针或为智能指针赋值。

14.1.4智能指针和异常

12动态内存_第11张图片

12.1.5unique_ptr

某个时刻智能有一个unique_ptr指向一个给定的对象(独占)。

12动态内存_第12张图片
12动态内存_第13张图片
12动态内存_第14张图片

12.1.6weak_ptr

12动态内存_第15张图片
12动态内存_第16张图片

核查指针类

是用weak_ptr去初始化类成员,不会影响weak_ptr指向对象的生成期。

12.2动态数组

12.2.1new和数组

12动态内存_第17张图片

分配一个数组会得到一个元素类型的指针

12动态内存_第18张图片

如果初始化器数目小于元素数目,剩余元素将进行值初始化。如果初始化器数目大于元素数目,则new表达式失败,不会分配内存。

动态分配一个空数组是合法的

12动态内存_第19张图片

按逆序销毁,从后向前

12动态内存_第20张图片
12动态内存_第21张图片

可以用下标访问。

12动态内存_第22张图片

12.2.2allocator类

12动态内存_第23张图片

allocator分配为构造的内存,要使用其返回的内存,必须用construct构造对象。使用未构造的内存,其行为是未定义的。

你可能感兴趣的:(12动态内存)