前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++学习——动态内存分配「建议收藏」

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

作者头像
全栈程序员站长
发布2022-09-23 20:36:27
6860
发布2022-09-23 20:36:27
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

文章目录

何为静态内存分配?

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

为什么需要动态内存分配

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

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

解决方法:动态内存分配

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

动态申请内存操作符 new

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

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

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

释放内存操作符delete

delete 指针名p

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

注意问题

  1. 初始化问题 标准数据类型:
代码语言:javascript
复制
       int *point; 
       point=new int(2);

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

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

内存泄露举例

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

代码语言:javascript
复制
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列的动态数组:

代码语言:javascript
复制
char  *fp;
fp = new char[2][3];

正确实例:

代码语言:javascript
复制
char (*fp)[3];
fp = new char[2][3];

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

代码语言:javascript
复制
int **a = new int*[n];
    for(int i = 0; i < n; i++)
        a[i] = new int[m];

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 何为静态内存分配?
  • 为什么需要动态内存分配
  • 解决方法:动态内存分配
  • 动态申请内存操作符 new
    • new 类型名T(初始化参数列表)
    • 释放内存操作符delete
      • delete 指针名p
      • 注意问题
        • 内存泄露举例
        • 申请和释放动态数组
        • 动态创建多维数组
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档