C++标准库
动态内存
动态分配的对象的生存期与它们在哪里创建是无关的,只有当显式地被释放时,这些对象才会被销毁。
静态内存
用来保存局部地static对象、类static数据成员、以及定义在任何函数之外地变量。
栈内存
栈内存用来保存定义在函数内的非static对象
分配在静态内存或是栈内存中的对象由编译器自动创建或销毁
堆、自由空间
程序用堆来存储动态分配的对象,即程序运行时分配的对象;其生存期由程序来控制,不用时,我们的代码必须显式销毁它们
动态内存与智能指针
使用新标准库的智能指针可以更好地管理动态内存,在memory头文件中
- shared_ptr:允许多个指针指向同一个对象
- unique_ptr:独占所指向的对象
shared_ptr类
shared_ptr和unique_ptr都支持的操作
- shared_ptr
sp 空智能指针 - p 用作条件判断,若指向一个对象则为true
- *p 解引用
- p->mem
- p.get()
- swap(p,q)
仅shared_ptr支持的操作
- make_shared
(args) 指向一个动态分配的T类型的对象,返回一个shared_ptr - shared_ptr
p(q) p是shared_ptr q的拷贝 - p = q 递减p的引用次数,递增q的引用次数
- p.unique() 若p.use_count()为1,返回true
- p.use_count() 返回与p共享对象的智能指针数量
make_shared函数
- 最安全的分配和使用动态内存的方法
1 | shared_ptr<int> p3 = make_shared<int>(42); |
shared_ptr的拷贝和赋值
当进行拷贝和赋值时,每个shared_ptr都会记录有多少个其他shared_ptr指向相同的对象
shared_ptr自动销毁所管理的对象
- 使用析构函数
shared_ptr会自动释放相关联的内存
1 | void use_factory(T arg){ |
当p被销毁时,p所指向的对象也会被销毁(如果没有其他指针指向它)
1 | shared_ptr<Foo> use_factory(T arg){ |
在这种情况下,return向其调用者返回一个p的拷贝。引用计数器++,所以不会销毁p所指的对象
使用动态生存期资源的类
- 程序不知道自己需要使用多少对象
- 程序不知道所需对象的准确类型
- 程序需要在多个对象间 共享数据
容器类出于第一个原因使用动态内存;
目前为止,我们使用的类中,分配的资源与对应对象的生存期一致,但某些类分配的资源具有与原对象相独立的生存期。例如,如果两个类共享底层的数据,当某个类被销毁时,我们不能单方面地销毁底层数据:
1 | Blob<string> b1; |
使用shared_ptr共享数据
1 | class StrBlob{ |
1 | StrBlob::StrBlob(initializer_list<string> il): |
直接管理内存
使用new动态分配和初始化对象
在自由空间分配的内存是无名的, 因此new无法为其分配的对象命名, 而是返回一个指向该对象的指针:
int * p = new int // p指向一个动态分配的,未初始化的无名对象
默认初始化和值初始化
括号包围的初始化器
1 | auto p1 = new auto(obj)// c++11标准 |
用new分配const对象
1 | const string * pcs = new const string; |
- const对象必须进行初始化, 定义了默认构造函数的类类型可以隐式初始化。
内存耗尽
1 |
|
调用者必须记得释放内存
1 | Foo* factory(T arg){ |
动态数组
- Post title:C++标准库
- Post author:sixwalter
- Create time:2023-08-05 11:14:26
- Post link:https://coelien.github.io/2023/08/05/coding-solution/c++ primer_std/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.