动态分配内存

指针和动态数组 new ,delete

纵然是瞬间 提交于 2020-03-17 06:58:15
............心中要有一内存块,以便理解知识 计算机储存数据必须知道数据的3种属性: 1.存储在何处.......并起名 2.值 3.类型 (1)int a;a=30; (2)int *b=&a; (3).int *a,b;注意...整型....指针a,整型...变量b,对每个指针都要有一个*; .......................指针.......................................... 1.指针是一个变量,存储的是...值的地址,而不是值本身, 指针变量 是指向特定变量类型指针,和数组相似 ..int* tax;...............指向int变量的指针,又叫整型指针 ..double * str;.............指向double变量的指针 ..int 指针和double指针虽然指向的数据类型不同, 但这两个变量本身长度的通常是一样的,好比1016可能是超市的地址,也可能是,村庄的地址一样,.....地址的长度或值,不能指示该地址上有什么建筑物,也不指示有关变量的长度或类型的任何信息 .显示地址,cout常用16进制 .......................指针与c++原理.......................................... oop强调的是运行阶段进行决策; 如

C++面试题

时光怂恿深爱的人放手 提交于 2020-03-08 08:06:32
语言基础类 1. 指针和引用的区别? (1)指针有自己的一块空间,而引用只是一个别名;  (2)使用 sizeof 看一个指针的大小为 4 字节(32位,如果要是64位的话指针为8字节),而引用则是被引用对象的大小。 (3) 引用必须在定义时被初始化,指针不必; (4)不存在指向空值的引用,但存在指向空值的指针。 2.static和 const的用法,(能说出越多越好)(重点) 首先说说const的用法(绝对不能说是常数) 1.限定变量为不可修改。 2.限定成员函数不可以修改任何数据成员。 3.使用const关键字修饰的变量,一定要对变量进行初始化 下面的声明都是什么意思? const int a; a是一个常整型数 int const a; a是一个常整型数 const int *a; a是一个指向常整型数的指针,整型数是不可修改的,但指针可以 int * const a; a为指向整型数的常指针,指针指向的整型数可以修改,但指针是不可修改的 int const * a const; a是一个指向常整型数的常指针,指针指向的整型数是不可修改的,同时指针也是不可修改的 通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 合理地使用关键字const可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少bug的出现。

Linux内存分配机制

不羁岁月 提交于 2020-03-07 14:07:34
原文:https://blog.csdn.net/gfgdsg/article/details/42709943 Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通过每个进程上的页表(在每个进程的内核虚拟地址空间)与物理地址进行映射,获得真正物理地址; 3、如果虚拟地址对应物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。 基于以上认识,进行了如下分析: 一、Linux 虚拟地址空间如何分布? Linux 使用虚拟地址空间,大大增加了进程的寻址空间,由低地址到高地址分别为: 1、只读段:该部分空间只能读,不可写;(包括:代码段、rodata 段(C常量字符串和#define定义的常量) ) 2、数据段:保存全局变量、静态变量的空间; 3、堆 :就是平时所说的动态内存, malloc/new 大部分都来源于此。其中堆顶的位置可通过函数 brk 和 sbrk 进行动态调整。 4、文件映射区域 :如动态库、共享内存等映射物理空间的内存,一般是 mmap 函数所分配的虚拟地址空间。 5、栈:用于维护函数调用的上下文空间,一般为 8M ,可通过 ulimit –s 查看。 6、内核虚拟空间

8.动态内存管理malloc calloc realloc free

半世苍凉 提交于 2020-03-01 21:24:36
malloc 描述 C 库函数 void *malloc(size_t size) 分配所需的内存空间,并返回一个指向它的指针。 声明 下面是 malloc() 函数的声明。 void *malloc(size_t size) 参数 size – 内存块的大小,以字节为单位。 返回值 该函数返回一个指针 ,指向已分配大小的内存。如果请求失败,则返回 NULL。 realloc 描述 C 库函数 void *realloc(void *ptr, size_t size) 尝试重新调整之前调用 malloc 或 calloc 所分配的 ptr 所指向的内存块的大小。 声明 下面是 realloc() 函数的声明。 void *realloc(void *ptr, size_t size) 参数 ptr – 指针指向一个要重新分配内存的内存块,该内存块之前是通过调用 malloc、calloc 或 realloc 进行分配内存的。如果为空指针,则会分配一个新的内存块,且函数返回一个指向它的指针。 size – 内存块的新的大小,以字节为单位。如果大小为 0,且 ptr 指向一个已存在的内存块,则 ptr 所指向的内存块会被释放,并返回一个空指针。 返回值 该函数返回一个指针 ,指向重新分配大小的内存。如果请求失败,则返回 NULL。 calloc 描述 C 库函数 void

实现动态分配内存

偶尔善良 提交于 2020-03-01 08:42:54
9- 2 - 7 实现动态分配内存 有些时候我们需要在内存主动申请内存来保存我们的数据,实现动态分配内存的效果,头文件 #Include <stdlib.h> 声明了个关于内存动态分配的函数 。 malloc ( )函数 函数原型 void * malloc(usigned int size) • 作用——在内存的动态存储区(堆区)中分配一个长度为size的连续空间。 • 形参size的类型为无符号整型,函数返回值是所分配区域的第一个字节的地址, 即此函数是一个指针型函数,返回的指针指向该分配域的开头位置。 • malloc(100); 开辟100字节的临时空间,返回值为其第一个字节的地址 2.free( )函数 函数原型:void free(void *p) • 作用——释放变量p所指向的动态空间,使这部分空间能重新被其他变量使用。 • p是最近一次调用calloc或malloc函数时的函数返回值 • free函数无返回值 • free(p); // 释放p 所指向的已分配的动态空间 为了更深入的理解malloc()函数和free()函数,我们来讲一个动态内存分配案例: 动态创建数组,输入5个学生的成 绩,另外一个函数检测成绩低于60 分的,输出不合格的成绩 。 实例 9-10 #include <stdlib.h> #include <stdio.h> int main() {

【C++】动态分配内存用法

喜夏-厌秋 提交于 2020-02-23 03:32:38
new分配内存: (ListNode 是一个结构体类型) ListNode *L=new ListNode() 初始化一个空节点,无值,不提倡此种写法。 ListNode *L=new ListNode(0) 初始化一个节点值为0的空节点,最常用最正规写法 ListNode *L=null 为空,什么都没有; 1、分配单个变量空间 Type *pointer = new Type;delete pointer 2、分配数组空间 Type *pointer = new Type[N]; delete[] pointer 动态内存方法的两种方法实际上是C++标准库提供的库函数 void *operator new(size_t); //allocate an object void *operator delete(void *); //free an object void *operator new[](size_t); //allocate an array void *operator delete[](void *); //free an array 3、关键字new 与函数malloc的区别 关键字new 与函数malloc的区别 new malloc C++关键词 C库函数 以具体类型为单位进行内存分配 以字节为单位进行内存分配 new在申请单个类型变量时可进行初始化

RT-thread内核之小内存管理算法

一世执手 提交于 2020-02-12 22:12:27
一、动态内存管理 动态内存管理是一个真实的堆(Heap)内存管理模块,可以在当前资源满足的情况下,根据用户的需求分配任意大小的内存块。而当用户不需要再使用这些内存块时,又可以释放回堆中供其他应用分配使用。RT-Thread系统为了满足不同的需求,提供了两套不同的动态内存管理算法,分别是 小内存管理算法 和 SLAB内存管理算法 。小堆内存管理模块主要针对系统资源比较少,一般用于小于2M内存空间的系统;而SLAB内存管理模块则主要是在系统资源比较丰富时,提供了一种近似多内存池管理算法的快速算法。 两种内存管理模块在系统运行时只能选择其中之一或者完全不使用动态堆内存管理器。这两种管理模块提供的API接口完全相同。 因为动态内存管理器要满足多线程情况下的安全分配,会考虑多线程间的互斥问题,所以请不要在中断服务例程中分配或释放动态内存块。因为它可能会引起当前上下文被挂起等待。 二、小内存管理算法 本文主要介绍小内存管理算法,至于SLAB内存管理算法则在后续文章中介绍。小内存管理算法是一个简单的内存分配算法。初始时,它是一块大的内存。当需要分配内存块时,将从这个大的内存块上分割出相匹配的内存块,然后把分割出来的空闲内存块还回给堆管理系统中。每个内存块都包含一个管理用的数据头,通过这个头把使用块与空闲块用双向链表的方式链接起来,如 内存块链表图所示:

11、动态分配内存malloc/free

眉间皱痕 提交于 2020-02-09 02:26:58
动态分配内存 内存的申请和释放使用两个函数来实现: malloc/free。 malloc 申请内存 #include<stdlib.h> int main() { int* p = (int*)malloc(100 * 4);// 申请100*4字节 for(int i = 0;i <100;i++){ p[i] = i * i; // 使用这块内存 } return 0; } 需要注意的是,要申请空间的大小以字节为单位,应用程序自己负责计算一共需要多少字节。比如要存储100个int,那么所需空间的大小应该是400字节,可以用malloc(100*4)或者malloc(100*sizeof(int))来指定大小。 Malloc的返回值指向了这块申请到的内存,应用程序需要把它强制转为指定的数据类型。这块内存和数组没有本质区别,用法完全相同。 free 释放内存 #include<stdlib.h> void free(void*ptr); 实例:用Citizen表示一个市民,用Car表示一辆车。一个市民起初没有车,但未来可能有一辆车。 #include<stdlib.h> #include<string.h> struct Car{ char maker[32]; // 制造商 int price; // 价格 }; struct Citizen{ char name[32]; /

C 动态内存分配

北慕城南 提交于 2020-02-07 21:03:01
动态内存分配 1. 概念 程序运行时临时分配存储区的方法 2. 优点 临时决定需要分配的存储区数量 生命周期自己决定 以前讲声明变量,在变量生命周期开始的时候,计算机为变量分配存储区,生命周期结束的时候,计算机把变量的存储区收走。而动态内存分配是我们需要的时候,要求计算机为我们分配存储区,并且计算机不会主动把存储区收走 3. 使用方法 malloc 函数可以动态分配一组连续的字节 int * p_val = ( int * ) malloc ( 5 * sizeof ( int ) ) ; free 函数可以释放一组动态分配的字节 free ( p_val ) ; calloc 函数也可以动态分配内存并且把内存内容都设置成0 calloc 用法和 malloc 基本一样,最大区别就是 malloc 分配的存储区内容是随机的 int * p_val = ( int * ) calloc ( 5 , sizeof ( int ) ) ; 以上函数使用之前都需要包含 stdlib.h 头文件 动态分配内存和数组的结构一样,可以把 p_val 当做数组名称来使用动态分配内存 动态分配内存释放之前可以在不同的函数间自由传递(比如调用函数使用被调函数的存储区),因为动态分配内存的生命周期是由程序来管理的 //使用动态分配内存的代码框架1 # include <stdio.h> #

常见的动态内存分配错误

六月ゝ 毕业季﹏ 提交于 2020-02-07 03:53:23
在使用动态分配的内存时,常出现的错误为:对null指针进行解引用操作(*),对分配的内存进行操作时越过边界,释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存被释放之后被继续使用。 传递给free的指针必须是从malloc、calloc、realloc函数返回的指针,传给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即终止或在晚些时候终止。试图释放一块动态分配的内存的一部分也可能引起类似问题。例如 pi = malloc(10 * sizeof(int)); free(pi + 5);//释放后五个 这样企图释放内存的一部分是不容许的,必须整块一起释放。但realloc函数可以缩小一块动态分配的内存,有效释放它尾部的部分内存。 注意不要访问已经被free释放掉的内存,如果对指向动态分配的内存指针进行了复制,而且这个指针的几份copy散布于程序各处,则无法保证当年使用其中一个指针时它指向的内存是不是已被另一个指针释放(野指针,应将这些指针全部指向NULL)。另外必须保证程序中所有使用这块内存的地方在这块内存被释放之前停止对它的使用。 ------------------------ 动态分配内存最常见的错误是忘记检测所请求的内存是否分配成功。可以用一下方式进行改进: #include<stdlib.h> #define malloc /