C++primer 第十二章笔记 初稿
来源:互联网 发布:js中undefined null 编辑:程序博客网 时间:2024/05/20 16:40
12.1 概述
局部static对象,类的static数据成员及定义在函数之外的变量,都保存在静态内存中;
函数内的非static对象保存在栈中;
动态分配的对象存储在堆中(运行时分配内存);
shared_ptr
use_count()
返回与调用指针共享所指对象的指针数量。unique()
如果use_count()为1返回true,否则返回false。赋值
如果进行p=q操作,则p的引用次数递减,q的引用次数递增,且当p的引用次数为0时,释放所管理的原内存。make_shared<类型>(初始化)
标准库函数,安全的内存分配方法,返回指向此对象的shared_ptr使用内置指针初始化shared_ptr可能存在的问题
int *x = new int (42);shared_ptr<int> p1(x);process(p1); //内存不会被释放,不存在问题process(shared_ptr<int>x)//存在问题,x被释放(不会报错)
get()
返回一个指向智能指针管理对象的内置指针。初始化的第二个参数,可以接收一个函数作为删除器(不一定是谓词)。
注:
- shared_ptr在重排操作中,可能会产生无用的shared_ptr,应及时删除。
- 内置指针与智能指针不存在隐式转换,必须直接初始化。
- 当使用get()方法时,很容易产生释放对象空间的疏漏。
unique_ptr
初始化时需要直接拷贝,该类指针不支持拷贝
unique_ptr<int> p(new int (42));
release()
返回所拥有的指针,并将unique_ptr置空。reset()
释放所指的对象。reset(内置指针)
改变指针,指向该对象。- 可以定义与shared_ptr类似的带删除器版本,但必须同时提供删除器类型。
注:使用release()时,必须保存返回结果,否则容易造成内存泄漏。
weak_ptr
use_count()
返回与该指针指向同一个对象的shared_ptr的数量expired()
如果use_count()为0返回true,否则返回false- lock()
expired()为true返回空shared_ptr,否则返回一个指向该对象的shared_ptr
注:weak_ptr时常用来检查shared_ptr指向对象是否存在,在获取shared_ptr时应使用lock()方法。
auto参与动态分配初始化时,提供初始值的括号内必须仅有单个初始化器。
动态分配内存上限虽然很大,但是也有分配上限。达到分配上限时,抛出bad_alloc异常。使用定位new可以避免该异常:
int *p = new (nothrow) int;
12.2 动态数组
通过new操作获取的对象,并非为数组类型,而是数组元素类型的指针。因此,不能对该指针调用全局begin()和end(),也不能使用范围for。
当使用new操作分配一个长度为0的动态数组时,可以将其作为尾后迭代器使用。
当使用new运算生成动态数组,并用作shared_ptr的初始化时,必须提供删除器(因为默认是删除单个对象)。
allocator类
初始化
allocator<int> a;
allocate(n)
分配长度为n的,未构造的内存deallocate(p,n)
释放从p开始长度为n的内存,且有如下要求:- n必须是创建时所要求的大小
- 在释放之前必须先执行destroy
construct(p,args)
构造对象destroy(p)
执行析构函数为了让allocator与标准库中的其他容器一起工作,标准库还提供了两个伴随算法:
- uninitialized_copy()
- uninitialized_copy_n()
- unintialized_fill()
- uninitialized_fill_n()
- C++primer 第十二章笔记 初稿
- C++primer 第九章笔记 初稿
- C++primer 第十章笔记 初稿
- C++primer 第二章笔记 初稿
- C++primer 第三章笔记 初稿
- C++primer 第四章笔记 初稿
- C++primer 第五章笔记 初稿
- C++primer 第六章笔记 初稿
- C++primer 第十一章笔记 初稿
- C++primer 第十三章笔记 初稿
- C++primer 第十四章笔记 初稿
- C++primer 第十五章笔记 初稿
- C++primer 第十六章笔记 初稿
- C++ primer 第八章笔记 初稿
- C++ primer 第十六章笔记 初稿
- C++Primer学习笔记第十二章(12/18)类
- C++primer第五版第十二章学习笔记
- c++primer第十二章读书笔记
- 树
- 【数据结构】中的堆(HeapSort)排序
- 虚拟机搭建CDH-第六讲-安装mysql第一种方法(比较简单)
- XTUOJ1264:Partial Sum(前缀和)
- 《PCL点云库学习&VS2010(X64)》Part 37 FLANN——快速最近邻搜索库
- C++primer 第十二章笔记 初稿
- 学习笔记2-- Activity的什么鬼
- 烟台大学 oj 1006
- C#学习笔记 5 运算符
- mysql数据库(七)
- TCP/IP协议要点
- epoll模型之服务器设计
- ArryList的扩容机制
- OpenCV: 常用操作