一 动态分配内存的概述

在数组一幕中,介绍过数组的长度是事先预定好的,在整个程序中固定不变。但是在实际的编程过程中,往往会发生这种情况:我们并不清楚到底需要多少数目的空间,而且无法事先预定,所以对了应对这种情况,c++准备了一些关键字,可以需要按动态去分配内存空间,也可以把不再需要的空间回收利用。

二 静态分配和动态分配

静态分配:

1.在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式,int a[10];

2.必须事先知道所需空间的大小;

3.分配在栈区或者全局变量区,一般以数组的形式存在。

动态分配:

1.在程序运行过程中,根据需要大小自由分配所需空间;

2.按需分配;

3.分配在堆区,一般使用特定的关键字进行分配。

三 new和delete

new负责申请空间,而delete负责释放空间。

example:

int *p=NULL;

p=new int ;//从堆区里申请int类型大小的空间。

*p=100;

cout<<*p<<endl;//输出结果为100。

//一定要记得释放空间,不然的话只要你进程不结束,这个堆栈空间就会一直存在。

delete p;//new和delete一定要成对的出现。

//new申请空间的同时,可以同时初始化空间的内容。

int *p1=NULL;

p1 = new int (100);

cout<<*p1<<endl;//输出结果为100。

delete p1;//不要忘记释放空间哦。

new与delete操作数组空间,new在申请的时候要加上“[ ]”,而delete在释放空间的时候也需要带上“[ ]”。

example:

int *arr=NULL;//做一个指针去指向申请的空间。

arr=new int [5]{10,20,30,40,50};//申请int类型的数组,包含了5个元素,用大括号同时初始化。

delete [] arr;//释放空间,但是是数组 [ ] 。

四 字符串处理数组

字符串操作函数:#include<string.h>

测量字符串长度的strlen函数:

size_t strlen(const char *s);//s指的是需要测量的字符串长度的首地址。

example:

#include<string.h>

char str1[128]="hello";

strlen(str1);//结果为5。

char str2[128]="he\0llo";

strlen(str2);//结果为2。

字符串拷贝函数strcpy函数

将一个字符串数组拷贝到另一个字符串数组里面。

char *strcpy(char *dest,char *src);

char *strcpy(char *dest,char *src,size_t n);

//dest:目的空间地址。src:原字符串数组空间首地址。

目标拷贝空间一定要保证有足够大的空间,不然会造成内存污染。

不仅是拷贝需要内存,而且字符串尾部追加也可以用这个函数,前提是保证目标对象空间足够。

字符串比较函数strcmp:

#include<string.h>

int strcmp(const char *str1,const char *str2);//逐个比较字符串内字符的大小。

int strcmp(const char *str1,const char *str2,size_t n);//逐个比较字符串前n个字符的大小。

返回值:

>0:str1大于str2字符串。

<0:str1小于str2字符串。

==0:str1字符串大小等于str2字符串。

五 结构体

结构体概述:将不同类型的数据组合为一个有机的整体。

c++提供struck关键字,可以将不同类型的数据封装在一起,这个被封装的整体就是结构体。

结构体类型的定义:

struck 结构体类型名

{

  数据列表(数据类型+单个结构体内数据数目)

}(结构体成员名称);

example:

上面的lucy和bob就是结构体的成员名,而该结构体类型为“Student”。

三种定义结构体类型的方法

1.先定义结构体类型,再定义结构体变量。

2.定义结构体类型的同时,定义结构体变量。

3.不定义结构体类型,定义结构体变量(比较浪费,只能一次性使用)

结构体变量的初始化:

结构体在初始化的时候必须严格遵守数据成员的顺序和对应的数据类型。

结构体在使用后如果不及时赋值或者初始化,那么输出结果为乱码。

使用memset清空整个结构体变量

void* __cdecl memset(
  _Out_writes_bytes_all_(_Size)   void* _Dst,
  _In_                  int _Val,
  _In_               size_t _Size
          );

将地址从_Dst开始,长度为Size_t的所有字节赋值为Val。

Tips:

1.new申请空间后如果没有delete来释放空间的话,就会造成空间泄露,别的程序想释放也释放不了;

2.结构体在被定义时系统并不会为它开辟空间,而一旦我们使用了结构体系统就会立刻开辟空间;

3.结构体中的变量具有归属性,访问其中特定变量成员的方法是需要通过“结构体成员.数据类型名称”。

c++学习8 动态空间申请的更多相关文章

  1. C++基础:二维数组动态的申请内存和释放内存

    使用二维数组的时候,有时候事先并不知道数组的大小,因此就需要动态的申请内存.常见的申请内存的方法有两种:malloc/free 和 new/delete. 一.malloc/free (1)申请一维数 ...

  2. 纯干货:深度学习实现之空间变换网络-part2

    https://www.jianshu.com/p/854d111670b6 纯干货:深度学习实现之空间变换网络-part1 在第一部分中,我们主要介绍了两个非常重要的概念:仿射变换和双线性插值,并了 ...

  3. C++解析-外传篇(3):动态内存申请的结果

    0.目录 1.动态内存申请一定成功吗? 2.new_handler() 函数 3.小结 1.动态内存申请一定成功吗? 问题: 动态内存申请一定成功吗? 常见的动态内存分配代码: C代码: C++代码: ...

  4. C语言学习笔记--动态内存分配

    1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名. ①内存分配由编译器在编译期间决定 ②定义数组的时候必须指定数组长度 ③数组长度是在编译期就必须确 ...

  5. C++学习之动态数组类的封装

    动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构 ...

  6. C++中动态内存申请的结果

    1,问题: 1,动态内存申请一定成功吗? 1,不一定成功: 2,常见的动态内存分配代码: 1,C 代码: * sizeof(int)); if( p != NULL ) { // ... ... } ...

  7. Android6.0动态权限申请

    goggle在Android6.0要求部分权限需要动态申请,直接下载AndroidManifest.xml中无效 6.0权限的基本知识,以下是需要单独申请的权限,共分为9组, 每组只要有一个权限申请成 ...

  8. sourceforge免费空间申请及使用笔记

    sourceforge免费空间申请及使用笔记 sourceforge免费空间安装WordPress博客程序 WordPress博客程序安装文件的上传需要使用工具WinSCP. 你需要在FTP地址填写的 ...

  9. winfrom之动态控件生成以及保存动态空间的数据

    前些天要完成一个winform程序,里面涉及到动态控件的添加以及保存动态空间中数据的保存,效果如下 初始化时: 点击添加阶梯价后:(点击一下,动态添加一行) 那么接下来,我们就具体的讲下代码实现: 首 ...

  10. Android6.0动态权限申请步骤以及需要注意的一些坑

    因为工作需要,简单研究了一下Android6.0权限申请,在Google提供的sample的基础上,写了一个简单的demo.算是自己的笔记吧,可能会比较混乱,主要是方便以后查看.后期有别的问题,随时更 ...

随机推荐

  1. Eclipse编程工具的使用( for Jave EE )

    一.下载安装 Eclipse IDE for Java EE Developers 1.1 下载 官方下载:https://www.eclipse.org/downloads/ 推荐下载2021-09 ...

  2. geoserver的自动化部署

    年后接到一个任务,需求是这样的: 搭建一个geoserver服务器,将公司内部的mbtile数据(EPSG:3857)发布出去 服务的输出格式为MBTiles with vector tiles的矢量 ...

  3. SpringBoot中SpringMVC异常处理机制

    声明 源码基于SpringBoot 2.3.12 前置知识 Tomcat异常处理机制 使用例子 原理简要介绍 先来看下Spring Boot中默认的处理行为,如果DispatcherServlet执行 ...

  4. 图像高斯滤波的Verilog实现

    高斯滤波的原理: 高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程.通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过 ...

  5. MySQL中的sql优化

    目标: 掌握SQL调优的原则 掌握SQL调优的基本逻辑 掌握优秀SQL的编写方案 掌握何为慢SQL以及检测方案 SQL优化原则 1.减少数据量(表中数据太多可以分表,例如超过500万数据  双11一个 ...

  6. OC基础 - iOS在枚举赋值时为何采用左移格式

    枚举值 1 - iOS 枚举成员在赋值时往往是如下模式:左移对齐 2 - 为何这般设计 ?其一提高了阅读性:其二便于计算,能够更好的表达枚举值的含义 1 #import "ViewContr ...

  7. 思科IPsecVPN建立

    实验拓扑 实验目标: 1.不配置中间的三个路由器的路由实现router0和router2的vpn隧道 2.PC0能够ping通PC1 实验IP预定: PC0 10.1.1.1/24 PC1 20.1. ...

  8. BIP弹框内容显示的隐藏

    viewModel.on("customInit", function (data) {         // 关闭或取消关原因详情--页面初始化         viewMode ...

  9. 关于osqp

    看了osqp的英文概要,记录如下: 1.采用交替方向乘子法 2.通过因式分解高速缓冲和热启动可以减少运算时间 3.适合嵌入式系统,实测mpc在10ms之内,路径规划在20ms左右(少障碍物),障碍物多 ...

  10. 吴恩达老师机器学习课程chapter01——序言+回归

    吴恩达老师机器学习课程01--序言+线性回归 本文是非计算机专业新手的自学笔记,欢迎指正与其他任何合理交流. 本文仅作速查备忘之用,对应吴恩达(AndrewNg)老师的机器学期课程第一章.第二章.第四 ...