【带头学C++】----- 四、动态内存空间申请 ---- 4.1 动态内存分配

1.动态内存分配概述

       在C和C++等语言中,可以使用malloc、calloc、realloc或使用new等函数来动态分配内存空间,同时使用free、delete函数释放动态分配的内存空间,这样可以根据程序的实际需要动态管理内存,避免静态内存分配的局限性。

       在数组一章中,我们讨论了数组的长度是在编程时预先定义好的,其大小在整个程序中都是固定的,无法动态改变。然而,在实际的编程中,我们经常会遇到一种情况,即所需的内存空间取决于实际输入的数据,而无法事先确定。为了解决这个问题,C++语言提供了一些关键字和函数,可以按需动态分配内存空间,并且可以在不再需要时回收和重复利用。

2.静态分配和动态分配

2.1 静态分配

      静态分配在编译时或程序运行之初为变量、数组或对象分配固定大小的内存空间。静态分配的空间大小固定,无法动态改变。

      静态分配速度快,但空间大小固定;动态分配灵活性高,但需要程序员手动管理内存申请和释放。

1、在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。int a[10]
2、必须事先知道所需空间的大小。
3、分配在栈区全局变量区,一般以数组的形式

2.2 动态分配

      动态分配在程序运行时根据需要动态地为变量、数组或对象分配内存空间。动态分配的空间大小可以根据运行时需求进行调整,并且可以在不再使用时释放内存空间以便重复利用。

1、在程序运行过程中,根据需要大小自由分配所需空间
2、按需分配。
3、分配在堆区,一般使用特定的关键字进行分配

3.new 和 delete关键字

new申请堆区空间    delete释放空间

new关键字

  • 动态分配内存:使用new关键字可以在堆上动态地分配内存,以创建对象或数组。语法如下:

    int *ptr = new int; // 动态分配一个整数大小的内存空间,并将其地址赋给ptr指针
    

    这行代码会在堆上分配足够的内存以存储一个整数,并将该内存的地址赋给指针ptr

  • 对象构造:如果你使用new来创建一个类的实例,C++会自动调用构造函数来初始化这个新对象。

delete关键字

  • 释放动态内存:使用delete关键字释放先前使用new动态分配的内存。语法如下:

    delete ptr; // 释放先前动态分配的内存,ptr是之前使用new分配的指针
    

    这行代码会释放ptr所指向的动态分配的内存空间,并将该内存空间返回给系统。

  • 对象销毁:如果你使用new来创建一个类的实例,在释放相应的动态内存时,C++会自动调用析构函数对对象进行清理。

示例

// 使用new关键字动态分配一个整数数组
int *arr = new int[5];

// 使用delete关键字释放动态分配的数组内存
delete[] arr;

注意事项

  • 在使用new分配内存后,务必在不再需要这部分内存时使用delete释放它,以避免内存泄漏。
  • 如果使用new动态分配了一个数组,应当使用delete[]来释放内存,以确保释放整个数组所占用的内存空间。

1.new和delete操作基本类型空间

注:new和delete需要成对出现,申请完必须释放,否则容易造成内存泄漏

 可以在申请空间的时候,初始化空间的内容。

 

         这里,在千峰教育C++基础知识视频课程中的案例中。老师应该是打错了,输出的时候应该是把p1输出,而不是p输出。注意这里的delete p之后没有置空,实际上是访问了之前分配的内存空间,这是一种未定义行为。这种情况下,即使指针指向的内存已经被释放,它们仍然保留了之前分配的地址。这就是为什么你可以看到似乎已经被释放的内存值仍然被打印出来。

2.new和delete操作数组空间

new申请空间的时候携带[ ]表示申请数组空间,delete释放的时候也需要带上[ ]

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小白Erike.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值