C++学习——动态内存分配「建议收藏」

C++学习——动态内存分配「建议收藏」文章目录何为静态内存分配?为什么需要动态内存分配解决方法:动态内存分配动态申请内存操作符 newnew 类型名T(初始化参数列表)释放内存操作符deletedelete 指针名p注意问题内存泄露举例申请和释放动态数组动态创建多维数组何为静态内存分配?通常定义变量(或对象),编译器在编译时可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候事先为他们分配确定的存储空间。这种…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

何为静态内存分配?

通常定义变量(或对象),编译器在编译时可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候事先为他们分配确定的存储空间。这种内存分配称为静态存储分配;
这种内存分配的方法存在比较严重的缺陷。

为什么需要动态内存分配

在使用数组的时候(线性拟合),总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能事先确定数组的大小。

  • 定义大了:空间浪费
  • 定义小了:不够用,可能引起下标越界错误,
  • 即使正好:如果因为某种特殊原因空间利用的大小有增加或者减少(增加点或减少点),你又必须重新去修改程序,扩大数组的存储范围。

解决方法:动态内存分配

C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区(stack),动态存储区,(堆heap区或自由存储区free store)
动态内存分配技术可以保证 程序在运行过程中,按照实际需要申请适量的内存,使用结束后还可以释放;
这种在程序运行过程中申请和释放的的存储单元也称为堆对象,申请和释放的过程一般称为建立(New)和删除(delete)
所有动态存储分配都在堆区中进行。

动态申请内存操作符 new

new 类型名T(初始化参数列表)

功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。
结果

  • 成功:T类型的指针,指向新分配的内存并
    返回该内存区域的首地址;
  • 失败:抛出异常。

释放内存操作符delete

delete 指针名p

**功能:**释放指针p所指向的内存。
p必须是new操作的返回值。

注意问题

  1. 初始化问题
    标准数据类型:
       int *point; 
       point=new int(2);

C++比C中多了类的概念,
建立对象时,要调用类的构造函数;
删除对象时,要调用类的析构函数。

  1. 内存泄露问题
    用new分配的内存,必须要用delete释放!
    否则,会导致分配的内存无法收回,使得程序占据的内存越来越大。

  2. 用new分配的内存,能且仅能用一次delete释放

内存泄露举例

下例中delete p; 是错误的 ,要用delete []p才行

int * p = new int[88]; 
delete p;  //这里就内存泄露了,要用delete []p才行
int function(int num)
{ 
   
         int *p = new[44];
         if( num > 111)
             return 0;
          delete []p;   
    return 1;
}

申请和释放动态数组

分配:new 类型名T [数组长度 ]
数组长度可以是任何表达式,在运行时计算
释放:delete [] 数组名p
释放指针p所指向的数组。
p必须是用new分配得到的数组首地址。

动态创建多维数组

new 类型名T[第1维长度][第2维长度]…;
如果内存申请成功,new运算返回一个指向新分配内存首地址的指针,是一个T类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。

错误示例:
例如:动态创建一个2行3列的动态数组:

char  *fp;
fp = new char[2][3];

正确实例:

char (*fp)[3];
fp = new char[2][3];

动态生成二维数组还可以这样子

int **a = new int*[n];
    for(int i = 0; i < n; i++)
        a[i] = new int[m];
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170923.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 图像处理及算法[通俗易懂]

    图像处理及算法[通俗易懂]一、基本概念1.1图像分类1.2图像处理方法模拟图像处理:也称光学图像处理,它是利用光学透镜或光学照相方法对模拟图像进行的处理,其实时性强、速度快、处理信息量大、分辨率高,但是处理精度低,灵活度差,难有判断功能。数字图像处理:即利用计算机对数字图像进行处理,它具有精度高、处理内容丰富、方法易变、灵活度高等优点。但…

    2022年5月16日
    39
  • DeepLearning之LSTM模型输入参数:time_step, input_size, batch_size的理解[通俗易懂]

    DeepLearning之LSTM模型输入参数:time_step, input_size, batch_size的理解[通俗易懂]1.LSTM模型输入参数理解(LongShort-TermMemory)lstm是RNN模型的一种变种模式,增加了输入门,遗忘门,输出门。LSTM也是在时间序列预测中的常用模型。小白我也是从这个模型入门来开始机器学习的坑。LSTM的基本概念与各个门的解释已经有博文写的非常详细:推荐博文:【译】理解LSTM(通俗易懂版)这篇文章写的非常详细,生动,概念解释的非常清楚。我也是从这个…

    2025年8月31日
    4
  • django不使用外键连接表_什么是外键和参照表

    django不使用外键连接表_什么是外键和参照表外键删除操作如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下:CASCADE:级联操作。如果外键对应的那条数据被删除了,

    2022年8月7日
    12
  • python 离散数学 判断单射 双射 满射

    python 离散数学 判断单射 双射 满射#离散数学判断单射双射满射defpanduan(sets):#单射标志danshe=True#满射标志manshe=True#将传入对象分隔开,存入两个变量set1,set2=sets#判断是否单射#遍历set1,set2中所有数据,是否在set2,set1中存在映射,判断是否满足单射或者满射foriinset1:#单射判断#如果set2中存在

    2022年5月29日
    73
  • Mac 安装 node.js 及环境配置[通俗易懂]

    Mac 安装 node.js 及环境配置[通俗易懂]目录安装node1:官网下载2:安装3:验证4:环境配置安装node1:官网下载访问nodejs官网,点击蓝色选框区域稳定版,并下载https://nodejs.org/en2:安装双击刚下载的文件,按步骤默认安装就行3:验证安装完成后打开终端输入npm-vnode-v两个命令,如下图出现版本信息,说明安装成功4:环境配置1:打开Mac终端,配置全局环境变量vim.bash_profile2:打开之后添加一行以下代码,(Mac的node,npm可执行文件都在/usr

    2022年5月13日
    59
  • java.lang.ClassNotFoundException: org.springframework.boot.Bootstrapper

    java.lang.ClassNotFoundException: org.springframework.boot.Bootstrapper错误13:20:03.686[main]ERRORorg.springframework.boot.SpringApplication-Applicationrunfailedjava.lang.NoClassDefFoundError:org/springframework/boot/Bootstrapper atjava.lang.ClassLoader.defineClass1(NativeMethod) atjava.lang.ClassLoader.defineCla

    2022年7月20日
    20

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号