【C/C++】 内存申请-----malloc与free和new与delete 使用指南

在C语言中,我们之前学过用数组去实现内存的分配,但是数组里面的内存是已经分配好的,是静态内存。那么如果我们想要实现动态内存的分配,这里就要用到分配内存的函数了,所以今天我就讲讲malloc函数和new函数的初步使用方法。

        在建立一个线性表的时候,其分配的内存是每次建立一个节点就分配这个节点的内存,所以用malloc函数或者new函数去计算机的内存堆里面去找出一个空闲的内存,然后把数据放到里面去。

目录

1.malloc函数与free函数

malloc函数:

 free函数

2. new函数和delete函数

new函数

delete函数



 

1.malloc函数与free函数

malloc函数:

头文件:#include<stdlib.h>或者#include<malloc.h>

函数声明(函数原型)

void *malloc(int size);    size表示分配的字节数

返回值:如果内存申请成功就会返回首地址,如果申请失败就会返回0

 我们可以看出malloc是一个void*类型指针,所以我们在使用的时候要去声明分配的是什么类型的指针。

例如要分配一个指针的内存:

int * p;

p=(int *)malloc(sizeof ( int ) );//表示分配到一个int类型的内存,同时返回的是int类型的指针

废话不说,直接上代码。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int* p;
	p = (int*)malloc(sizeof(int) * 100);//这里表示分配到100个int类型字节数的内存,等效于int a[100];
//还有就是malloc()函数里面的括号可以直接写入数字,比如我们知道int类型的字节数是4,那么我们也可以这么写p = (int*)malloc(400);其效果跟p = (int*)malloc(sizeof(int) * 100);是一样的
	//此时p是表示一个有分配到内存的指针,p可以当做数组来使用
	for (int i = 0; i < 100; i++)
		p[i] = i + 1;//进行赋值
	for (int i = 0; i < 100; i++)
		printf("%d ", p[i]);
	//也可以这样表示 	printf("%d ", *(p+i));
free(p);//释放掉内存
}

相关注意事项:

1.千万要记住用malloc函数时要进行指针类型强制转换,否则会出现报错,因为void*类型指针不可以去自动转换到其他类型的指针,这里必须要强制转换才可以。

2.还有就是内存分配问题,例如 int p=(int *)malloc( 1 ); 这里分配到字节数为1的内存,但是我在里面写入一个整形变量是错误的,因为int类型变量字节数是4,我实际上只分配了一个字节数,所以另外三个字节数就无家可归了,会直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。所以这种写法是错误的。

 free函数

函数定义:void free(void *addr)

作用:free函数的作用就是释放之前malloc函数申请的内存,把这些内存释放回到系统中。

        那这里有人会问,干嘛要去释放掉呢?我之前分配好了,闲着没事干释放掉干嘛呢?这里我要说一下,如果你在一个程序里边申请了一大块的内存,这个大内存储存的数据占用了你大部分的CPU,那么你如果要再次申请另外一个大内存的话,这会导致系统发生故障,造成内存泄漏。所以我们在申请完了一个内存使用完后要去释放掉,正所谓 有借有还,再借不难嘛。

下面是关于free在C语言里面的使用;

char *p;
p=(char *)malloc(sizeof(char)*200);
//……
//……使用过程
//……
free(p);//用完后直接释放掉就OK了

2. new函数和delete函数

new和delete这两个函数在C++里面保留的关键字,类似于结构体struct一样,使用这两个看上去是函数,实际上是关键字,使用不属于任何头文件里边的函数。

new函数

new函数是C++里面的一个函数,new函数是另外一种申请内存的方式,但是与malloc不同,new函数在分配内存的同时会把对象也分配好,也就是说你的申请对象是int类型的,那么new也会返回这个对象,所以在使用new函数去申请内存的时候就不需要指针类型强制转换。在C++里面new函数基本上取代了malloc函数,因为new函数已经具备了malloc函数分配内存功能的同时,还可以对对象进行初始化,这里是malloc函数不具备的功能。

举个例子:

int *p=new int;

那么返回就是这个p指针的地址,那如果申请失败的话就返回0

 在c++的编译器里面,这里我可以直接用C语言去使用这个函数。上代码:

#include<stdio.h>
int main()
{
	int* p = new int(2);//申请一个int*类型空间,小括号里面的是初始化值为2,把分配好的内存和初始化的数据返回给地址p
	printf("%d", *p);//输出结果为2
}

申请一个数组:

#include<stdio.h>
//申请一个数组
int main()
{
	
	int* p = new int[100]();//把数组数据初始化为0,这个小括号是表示把里面100个数字都初始化为0,但是小括号只能是空的,里面不可以写入数字
	//如果括号为空就是初始化为0
	printf("%d", *(p+15));
	
	delete [100]p;//释放内存
}
//输出结果为0
//如果想要进行数组初始化就要用到大括号
int* p = new int[10]{0,1,2,3,4,5,6,7,8,9};

delete函数

当然跟free一样,把申请的内存释放掉,其申请对象是new函数,所以delete与new一对,free与malloc一对。但是delete用法跟free有些不同。

1.如果是申请一个类型数据的话,就直接delete掉就好了

int* p = new int;
//……
//…………
delete p;

 2.如果申请的是一个数组数据的话就加上数据的申请数量

int* p = new int[100];
//…… ………… 
delete [100]p;

 

申请内存空间不止这两种方法,还有其他的,例如calloc,realloc这两个申请函数,这里就不做介绍了。

小总结:熟练掌握动态内存分配函数,我们就可以去创建一个线性表了。如果在分配内存的时候,要看看是分配哪种类型的内存,是否想要初始化,如果要初始化的话最好就用new函数,这些就看个人实际情况吧。最重要啊,一定一定要记得释放内存,养成好习惯,要有借有还。

我就介绍到这里了,Thanks~~

  • 3
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Fitz&

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

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

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

打赏作者

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

抵扣说明:

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

余额充值