12 动态内存
动态内存 存在的问题:栈空间和堆空间的分配也是运行时内存分配,即动态内存分配。文字常量区、全局变量和静态变量区是在编译时内存分配,即静态内存分配。 栈空间的动态内存分配由操作系统管理。堆空间的动态内存分配由用户自身管理。二者可以交叉使用。 例如:使用栈空间无法返回局部对象,只能返回局部对象的复制(重写复制构造函数),比较麻烦,可以返回堆空间申请一个对象,并返回指向该对象的指针。 例如:使用堆空间,对象的释放需要自己管理,可以在栈空间创建一个局部对象,在其内部封装申请和释放堆空间的方法。当栈空间的局部对象被销毁时,调用析构函数,清除堆空间的对象。这也是allocator和智能指针的实现方案。(allocator一般使用栈对象的析构函数,销毁堆对象的空间。智能指针一般通过引用计数的方法销毁堆对象。) 关于汇编语言程序有两种方法进行动态分配:方法一:通过系统调用从操作系统获得内存块。(linux/windows操作系统提供了alloc方法和heap方法。在当前的进程中,后者用来申请新的私有堆,前者用来在已有的堆空间上申请内存。)方法二:实现自己的堆管理器来服务更小的对象提出的...
14.空指针悬空指针野指针
指针野指针野指针就是未进行初始化的指针,你不知道这个指针变量里面的内容是什么,一般是最近一次这块内存上面的内容,也就是说不知道用这个指针访问的内存是哪一块,所以指针初始化的时候要typename * p = nullptr; 悬空指针悬空指针就是将这个指针指向的内存已经释放了,却没有对指针进行赋空,因为C++并没有垃圾回收机制,你delete了一个指针只是释放了指针指向的内存空间,而指针本身依旧还在,正确的操作是delete一个指针后立马将指针赋值为nullptr 空指针就是指向NULL的指针,但是不保证一定是空,因为NULL本质就是0,我依旧可以用*p来访问地址为0的区域啊,虽然这是会被编译器禁止的。
13.动态内存管理实现
动态内存1 C中动态内存的实现概念 c 语言主要是使用malloc / calloc / realloc 来进行内存申请的。 共同点 都是从堆上进行动态内存分配 释放内存都是需要使用free函数来释放 三者的返回值都是void* 都需要强制类型转换 都需要对申请出的空间判空(因为申请内存失败会返回空) malloc1void *malloc( size_t size ); malloc的参数是用户所需内存空间大小的字节数,不会对申请成功的内存初始化。 malloc 申请空间时并不是需要多少就申请多少,而是会多申请一些空间, 多申请一个32字节的结构体,里面对申请的空间进行描述, 在申请的空间前后会各多申请 4 个字节的空间,这就是保护机制,当你操作不当越界了,这 8 个字节的内容会改变,操作系统会检查前后 4 个字节是否改变了,以此判断是否越界了。 calloc1void *calloc( size_t num, size_t size ); calloc的参数:第一个:元素的个数,第二个:单个元素所占字节;会把申请成功的空间初始化为 0 re...
1 通用工具
通用工具 目录 pair和tuple 智能指针 数值极值 type trait 和type utility 辅助函数 clock和timer bitset 随机数 1 pair和Tuple1.1 pair头文件1#include<utility> pair定义1pair<string,string> author{'James","joyce"}; pair操作 1.2 tuple头文件1#include<tuple> 定义 扩展pair的概念,拥有任意数量的元素。是一个异质的元素序列。 操作 123tuple<int,float,string> t1{2,3.4,"yin"};get<1>(t1);//获取t1的第一个元素make_tuple(22,44,"helo");//元素类型自动推导 2 smart pointer 智能指针3 极值头文件1#include<limits&...
0 简介
参考文献 《C++标准库》 《C++Primer》 《C++ STL使用例子大全》 1 C++ 语言新特性nullptr 取代NULL。用于防止0指针出现的歧义 auto自动完成类型推导一致性初始化与初值列表 可以使用大括号,完成所有的初始化。 范围for循环constexpr常量表达式Template特性Lambda表达式 没有参数和返回值的lambda表达式 123auto l=[]{ cout<<"hello world"<<endl;} lambda表达式的定义完成后直接调用 1[]{ cout<<"helloworld"<<endl;}(); 有参数的lambda表达式 1auto l = [](int a,int b){cout<<a+b<<endl;}; 有返回值的lambda表达式 1auto l = [](int m,int n)->int{co...
2 容器
容器1 简介 新标准库的容器壁使用原始的数组实现的数据结构要快很多。经过了精心的优化。 确定使用哪种容器 除非有明确的理由,否则使用vector 随机元素访问vector或deque 容器中间插入或者插入元素list、forward_list 头尾插入元素,使用deque 可以在输入阶段随机插入的时候使用list,然后将复制好的放到vector中加速访问。 C++ STL容器的实现 C++ STL容器概览 2 容器通用操作2.0 容器统一的操作 主要包括六类 构造函数(默认初始化、复制初始化、迭代器初始化、列表初始化) 赋值交换(c1=c2,c1={},assign,swap) 容器大小(size,max_size,empty) 插入删除(insert,emplace,erase,clear) 关系运算(六种关系) 迭代器(八个迭代器begin,end,cbegin,cend,rbegin,rend,crbegin,crend) 2.1 构造函数 共5+3=8种容器的初始化方法。 方法 说明 container c 默认初始...
2.1 顺序容器
顺序容器 目录 array vector deque双端队列 list forward_list string//专门用于字符串访问的容器 vector/deque/list拥有容器所有的操作。首尾相关的操作。 参考文献 vector/deque/list详解 0 顺序容器的通用操作 对迭代器的理解:迭代器就是指向元素的指针。通过指针的移动来访问元素。效率更快。 C++ 标准库提供了一系列范围相关的方法。例如 范围创建constructor{},constructor(beg,end) constructor(n,t) 范围替换assign({}),assign(beg,end),assign(n,t) 范围插入insert(p,{}),insert(p,beg,end),insert(p,n,t) 范围删除erase(beg,end) 范围重构resize(n),resize(n,t) 0.1 访问元素 也可以使用迭代器访问元素。 at会进行安全检查抛出异常。 []下标运算符不会进行检查。 ...
2.3 容器适配器
容器适配器 目录 stack queue priority_queue 参考文献 优先队列 0 简介概念 适配器 (adaptor) 是标准库的一个通用概念。容器、类和函数都有适配器。 本质上, 一个适配器是一种机制, 能使某种事物的行为看起来像另外一种事物一样。。一个容器适配器接受一种己有的容器类型, 使其行为看起来像一利1不同的类型。 添加额外操作,实现某种特殊的数据结构。 容器适配器的操作 可以用顺序容器初始化适配器。使用的是顺序容器的拷贝。 1 stack 默认基于deque实现,也可以基于list/vector 概念特有操作 2 queue概念 queue是基于deque实现的,也可以用vector或list priority_queue是基于vector实现的。也可以用deque实现 特有操作 3 priority_queue初始化 Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functi...
3 迭代器
迭代器1 基础头文件1#include<iterator> 迭代器范围 begin和end被容器使用了,可以用front和back作为游标。左闭右开区间 1[begin,end) 使用迭代器进行遍历 遍历方法有三种:下标遍历、范围for遍历、迭代器遍历 1234567container c;first = c.begin();last = c.end();while(first != last){ cout<<*first<<endl;//指向元素的游标指针。 ++begin;} 迭代器的类型 正常迭代器 12begin()end() 反向迭代器 12rbegin()rend() 常量迭代器 12cbegin()cend() 操作冲突容器操作可能会使迭代器实效。 2 迭代器类型——迭代器的适配器除了容器定义的迭代器之外,标准库头文件iterator总额外定义了几种迭代器。 插入迭代器。绑定到一个容器上,用来向容器中国插入元素 流迭代器。绑定到输入输出流上,用来遍历关联的IO流 反向迭代器。反...
4 算法
算法 参考文献 C++进阶:STL算法总结 C++标准库STL算法 1 泛型算法概览说明 容器的迭代器使得算法不依赖于容器。但算法依赖于元素类型的操作。 标准库仅仅提供了100多个算法 头文件 头文件 功能 <algorithm> 算法函数 <numeric> 数值算法 <functional> 函数对象/仿函数 分类 No. 分类 1 非可变序列算法Non-modifying sequence operations(不直接修改容器内容的算法。) 2 可变序列算法Modifying sequence operations(可以修改容器内容的算法。) 3 排序算法Sorting/Partitions/Binary search/(对序列排序、合并、搜索算法操作。) 4 数值算法Merge/Heap/Min/max(对容器内容进行数值计算。) 参数说明 参数 说明 beg 开始迭代器 end 终止迭代器 v...














