第12章 动态内存
12.1 动态内存与智能指针
12.2 动态数组
12.3 使用标准库:文本查询程序
12.1 动态内存与智能指针
-
对于
栈对象
,仅在其定义的程序块运行时才存在;static对象
在使用之前分配,在程序结束时销毁;除了静态内存和栈内存,每个程序还拥有一个内存池
。这部分内存被称为自由空间
或堆
。程序用堆来存储动态分配对象。动态对象的生存期由程序控制
-
在C++中,动态内存的管理是通过一对运算符来完成的:
new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化
delete,接受一个动态对象的指针,销毁该对象,并释放与之关联的内存
-
新的标准库提供了两种
智能指针
类型来管理动态对象。新标准库提供的这两种智能指针的区别在于管理底层指针的方式:
shared_ptr 允许多个指针指向同一个对象
unique_ptr则独占所指向的对象
另外还定义了一个名为weak_ptr
的伴随类,是一种弱引用,指向shared_ptr所管理的对象。这三种类型都定义在memory头文件中
-
类似于vector,智能指针也是模版,当创建一个智能指针时,必须提供指针可以指向的类型。默认初始化的智能指针中保存着一个空指针。解引用一个智能指针返回它指向的对象
-
shared_ptr类
make_shared函数.
最安全的分配和使用动态内存的方法就是调用一个名为make_shared函数,此函数在动态内存中分配一个对象并初始化它,返回指向该对象的shared_ptr。make_shared也定义在头文件memory中
传递的参数必须与string的某个构造函数相匹配,通常用auto定义一个对象来保存
shared_ptr的拷贝和赋值.
当进行拷贝和赋值时,每个shared_ptr都会记录有多少个其他的shared_ptr指向相同的对象。每个shared_ptr都有一个关联的计数器,通常称为其为引用计数
。拷贝一个shared_ptr ,计数器都会递增,给shared_ptr赋予一个新值或是shared_ptr被销毁,计数器就会递减。一旦一个shared_ptr的计数器变为0,它就会自动释放自己所管理的对象
shared_ptr自动销毁所管理的对象.
通过另一个特殊成员函数–析构函数
完成销毁工作。类似于构造函数,每个类都有一个析构函数。shared_ptr析构函数会递减它所指向的对象的引用计数,如果引用计数变为0,share_ptr的析构函数就会销毁对象,并释放它所占用的内