关于C++中的动态内存分配

1.malloc()、realloc()、free()函数   

这三个函数为c++标准库中的函数,都在#include <stdlib.h>中。

(1)void *malloc()的返回类型为空指针 void *,因为我们并不知道指针指向什么类型的数据,所以用void修饰。

用法:

malloc(size_t),size_t为我们要分配的内存的大小(单位为字节)。

若我们要为一个4个int型数据的数组开辟一块空间,则:int *p=(int *)malloc(4*sizeof(int))

sizeof(int)得到的是一个int型数据占用的字节。用(int *)将void *强制转换成指向int型数据的指针。

p为我们开辟的内存的首地址。开辟的内存在内部(即这4个元素所占的内存空间中)地址在逻辑和物理上都是连续的。

若我们又开辟一块内存空间int *q=(int *)malloc(2*sizeof(int)),q内部是逻辑和物理连续,但q和p所开辟的两块内存之间不一定是连续的。

(2)void *realloc()和malloc()类似,为已存在的内存空间重新开辟一块新的内存

用法:

realloc(首地址,重分配内存大小)

例如,int A[2]={1,2};  如果我们要向数组中增加一个元素,则需要对数组扩容

int *NewAddress=(int *)realloc(A,sizeof(int)*3);

如果在原有的内存空间M后紧接着存在一块连续的内存空间N满足M+N的大小等于我们所需的内存大小,则NewAddress==A;

若不存在,则会开辟一块新满足我们需求的内存空间,原有的内存空间里的值会按顺序拷贝到新的内存空间中,且原内存空间自动释放,此时,NewAddress!=A

(3)free()  配合malloc()和realloc() ,在不要此内存空间存储的值时,释放掉此块内存。 free(p)

 

动态分配是在堆中分配内存,需要程序员手动释放

2.new、delete

与malloc()和realloc()和free()不同,new、delete是C++关键字,不是标准库函数。

在使用new时会调用对象的构造函数,使用delete时会调用析构函数。在给非内置类型分配内存的时候,malloc和realloc无法满足动态内存分配(因为要计算所分配的内存大小),因而只能使用new关键字。

假如我们定义了一个类 Dog,为其动态分配内存:

Dog *dog=new Dog[5];

new关键字可以根据数字5自动计算5个Dog类的所需的内存是多少,并为其分配。得到的是一个指针

用完后要记得释放: delete []dog;

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值