12动态内存
每个程序分配有静态内存和栈内存,还有一个内存池称为自由空间或堆。用来存储动态分配。
12.1动态内存与只能指针
内存泄露:旺角是否内存;引用非法内存的指针:尚有指针引用内存却释放了。
智能指针:shared_ptr允许多个指针指向同一个对象,unique_ptr独占所指对象,weak_ptr弱引用指向shared_ptr。头文件memory。
12.1.1shard_ptr类
Make_shared函数
Shared_ptr有引用计数,拷贝或者利用其初始化或者传递给另一个函数或者作为函数返回值引用计数都会加1。给其赋新值,或是被销毁,或离开其作用域,计数器都会递减。计数器为0时,就会释放。还会释放相关联的内存。
12.1.2直接管理内存
Delete之后重置指针值
空悬指针,指针仍有但内存已经释放。
12.1.3shared_ptr和new结合使用
不能进行内置指针到智能指针间的隐式转换,必须使用直接初始化形式。
不要混合使用普通指针和智能指针,也不要使用get初始化另一个智能指针或为智能指针赋值。
14.1.4智能指针和异常
12.1.5unique_ptr
某个时刻智能有一个unique_ptr指向一个给定的对象(独占)。
12.1.6weak_ptr
核查指针类
是用weak_ptr去初始化类成员,不会影响weak_ptr指向对象的生成期。
12.2动态数组
12.2.1new和数组
分配一个数组会得到一个元素类型的指针
如果初始化器数目小于元素数目,剩余元素将进行值初始化。如果初始化器数目大于元素数目,则new表达式失败,不会分配内存。
动态分配一个空数组是合法的
按逆序销毁,从后向前
可以用下标访问。
12.2.2allocator类
allocator分配为构造的内存,要使用其返回的内存,必须用construct构造对象。使用未构造的内存,其行为是未定义的。