C++_动态存储空间的分配和释放

本文深入探讨了C++中动态内存管理的概念、原理及应用,包括new、delete与malloc、free的区别,如何在函数内外有效使用动态内存,以及常见问题解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用new申请空间:

特点:

        1、没有名字,只能通过指针间接访问它们。

        2、从堆中申请空间

分类:

变量:

          语法:指针变量 = new 类型名;

                      Delete 指针变量

          举例:int *p;

                      p=new int;

                      delete p;

          初始化:

                       *p=90;

                       p=new int(99);

一维数组:

           语法:指针变量 = new 类型名[下标表达式]; 下标表达式是整型常量或整型表达式

                       Delete [ ]指针变量;---[ ]表明是个数组,但不需要指出其大小

           举例:Int *p;

                       P= new type[s];

                       Delete [ ]p;

多维数组(二维数组):  必须指出所有维的长度

           语法:指针变量 = new 类型名[下标表达式] [下标表达式];

                       Delete [ ]变量名

           举例:定义一个3×4的数组

                       Int (*p)[4]; p是个指针,它指向一个n维数组(4定义的时候必须已知,即后几维必须已知

                       p=new int[3][4];// 第一维可以是常量或表达式,其他维必须全部为常量

                       Delete [ ]p;

对象:可以在创建对象的时候同时进行初始化

           语法: 类名 *指针变量 = new 类名(实参表);

对象数组:

           语法:类名 数组名[元素个数];

                       或: 类名* 指针名;指针名=new 类名[数组长度];

           举例:Point A[2];

                       Point* p;

                      *p=new Point[5];

                       delete [ ]p;

           初始化:每个对象都要调用一次构造函数和一次析构函数。

                 1)对象数组确定且长度有限:可以使用参数列表初始化

                    Point A[2]={Point(1,2),Point(3,4)};

                 2)对象数组长度比较大或不确定:只能调用无参或者使用缺省参数的函数

                  Point A[2];

            原因:在建立对象数组的时候,C++不允许整体对对象进行初始化(即[ ]和( )不能一起使用),这时不能给对象 使用有参数的构造函数

            所以:若创建一个类的对象数组,就对给类的构造函数有要求:对象数组只能调用一个不需要参数的构造函数

常见问题:

1):有了malloc/free 为什么还要new/delete?

           malloc/free 只能满足内部数据类型的变量,它们只需要申请空间,无法对空间进行操作

           而对于非内部数据类型的对象来说,对象在创建的同时要自动执行构造函数,在消亡之前要自动执行析构函数。

           由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够自动地调用构造函数和析构函数。即用无法满足动态对象的要求。

           因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete

           注意new/delete 不是库函数,而是运算符。malloc/free 是标准库函数。

2):malloc/free  和 new/delete 的相同点和不同点

             相同点:它们都可以申请和释放空间。

             不同点:

                      一、new :分配内存 + 调用类的构造函数 + 初始化  delete:释放内存 + 调用类的析构函数

                              malloc:只分配内存,不会进行初始化类成员的工作   free只释放内存,不会调用析构函数

                      二、new delete 是运算符,可以进行重载

                              malloc,free是函数,不可以进行重载

                      三、new delete 更加安全,简单:

                              不用计算类型大小:自动计算要分配存储区的字节数

                              不用强制类型转换:自动返回正确的指针类型

                     四、new可以分配一个对象或对象数组的存储空间,malloc不可以

                     五、可以超载与类相关的new和delete

                     六、malloc/free 是标准库函数,new/delete是C++运算符

2):new和delete搭配使用,malloc和free搭配使用:混搭可能出现不可预料的错误

3):new后执行的三个操作:(某面试题目)

                       1、new的类分配内存空间。
                       2、 调用类的构造方法。
                       3 、返回该实例(对象)的内存地址



为什么在函数里面申请的动态内存,在函数外就无效?

在函数里面申请的动态内存在函数有效的,但是指向这块内存的指针需要是全局的,否则局部指针被释放就找不到这块动态申请的内存,这样也就用不了,相当于无效了。
C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store)。通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为静态存储分配;有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。所有动态存储分配都在堆区中进行。 所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
使用动态内存分配的程序中,常常会出现很多错误。
1. 对NULL指针进行解引用操作
2. 对分配的内存进行操作时越过边界
3. 释放并非动态分配的内存
4. 试图释放一块动态分配的内存的一部分以及一块内存被释放之后被继续使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值