回顾C++,今天讲讲new,delete,动态分配与静态分配的区别

说到编程,不得不提变量

问题来了

问题1:什么是变量?

大白话就是:国家划了一块地,盖了间房子,这间房子的盖的大小,就指存储空间,这个房子就是变量,可以在房子里放东西,东西就是数据

专业语言就是:

变量,就是指系统在内存中分配的一块存储空间,可以用来存数据

那好说了,定义变量,就是通知系统在内存中分配一块存储空间

问题2:变量分配存储空间都有什么方式?

按照分配完成的时机分为两种:静态分配和动态分配

讲讲静态分配

静态分配指,在编程过程中按普通形式定义的变量,如 int a,

该句表示给a开辟一块存储空间,存储空间的大小为int型,这个空间算是定下了,不能进行改变

静态分配的缺点

因此 提出了一个问题,既然不能改变,那就说明不够弹性,万一数据大小超过了存储空间大小,或者数据远远小于存储空间大小呢?如果我定义一个 数组 a[100] 结果只用了20个呢?

因此,静态分配实在不够方便,太浪费空间了,而且程序在编写之初,编写者并不能确定分配多少才能不浪费。

因此动态分配来了

讲讲动态分配

动态分配,就是为了根据实际需要来确定分配的存储空间,在程序运行时进行分配。

C语言使用的函数是malloc() 和 free() 来动态分配内存空间和释放内存空间的,通常配合指针来使用

C++提供了更加简便、功能更强的运算符,new(),delete()

C:
	#include<iostream>
#include<stdlib.h>
using namespace std;
int main() {
	int* a;
	int* b;
	if((a=(int *)malloc(10*sizeof(int))) == NULL) 
		cout << "内存分配失败";
	*(a+1)=10;
	cout<<*(a+1)<<endl;
	free(a);
	a[1]=20;
	cout<<a[1]<<endl;
	if ((b = (int*)malloc(10 * sizeof(int))) == NULL)
		cout << "内存分配失败";
	cout << *(a + 1) << endl << a[1] << endl;
	return 0;
}	

可以理解为,malloc只有一套房子,把a存进去了,无论是否free(a)
(是否解出与malloc分配的存储空间的占用关系)a的值仍然可以访问,但当malloc把内存分配给其他变量,那么a就无法访问了

C++保存了malloc和free,但又提供了new和delete

这两个既可以当做运算符使用,也可以当做函数使用

new用于动态分配内存空间,并返回成功分配存储空间的首地址,若分配失败返回null

把new当做运算符使用
	指针变量名 = new 数据类型[数据个数]
把new当做函数使用
	指针变量名 = new(数据类型[数据个数])

执行new后,系统会从内存中一个叫"堆"的自由存储区中分配一块 连续的、大小等于单个数据类型所占字节数X数据个数的存储空间,并返回该内存的首地址

delete用于释放new分配的存储空间,应一起使用

分配:
				int *p;
当做运算符:		p = new int[10];  
		
当做函数:		p = new(int[10]);
		
释放
		若为变量
		delete 指针变量名
		delete p;
		
		若为数组
		delete []指针变量名
		delete []p;

分配好之后按照数组的形式去访问 *(p+i)

讲讲malloc和new的区别

虽然二者功能相同

但是new和delete有优于malloc 和free的地方

  1. malloc 需要人工分配存储空间,这就可能出现计算错误的情况

    而new是自动计算分配储存空间

  2. malloc 需要编程者把返回的分配好储存空间的首地址进行强制转换

    而new通过赋值运算符自动转换分配好存储空间的首地址

  3. new还可以为简单变量分配内存的同时进行初始化

    p = new int(99)  //动态分配内存空间,并初始化值为99
    
    也可以分配一片连续的空间给数组
    int *p = new int[10]		//一维
    int *p = new int[5][5]		//二维
    int *p = new int[3]{1,2,3};
    //即p[0]=1,p[1]=2,p[2]=3,即地址为p、p+1、p+2
    

    delete的时候不需要考虑维度,统一写成 delete[]指针变量名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值