动态内存申请与释放,new/delete,malloc/free的功能。

动态内存申请与释放:

new和malloc的功能:
malloc是从堆空间申请指定数额的内存空间给当前进程。
new在malloc的基础上,申请内存空间后调用对象的构造函数。

free和delete的功能:
free是将当前进程中从堆空间申请的内存中不需要的部分退还给堆空间,称为释放内存从进程释放到堆空间。
delete是在用free释放当前对象之前,调用该类的析构函数。

这四个关键字都需要和指针变量结合使用,需要有一个指针变量来指向被申请或被释放的内存。

动态分配内存的过程中,需要在栈空间申请一个四字节内存空间用于存放指针变量名等信息,通过指针变量申请、访问、释放堆中内存,故指针变量本身占用的是栈空间,其指向的内存占用的是堆空间。

函数中创建一个指针,此时该指针已经在栈空间中分配了大小为4字节的内存,但该指针不会自动指向Null,其值是随机的,是个野指针。

new和malloc申请的内存通过赋值号将其申请空间的首地址赋值给指针变量,将该指针初始化为正常的可用指针,此时该指针在栈空间占用4字节,在堆空间占用相应对象类型大小的内存空间。

free和delete将该指针指向的堆空间的内存释放掉,返还给堆空间,但该指针本身在栈空间中仍然存在且仍然指向堆空间中已经被释放的内存的地址,此时的指针就是“野指针”,为了避免在函数体后面的代码中因大意而调用野指针导致报错崩溃,需要将指针在释放掉堆空间之后立刻让其指向NULL或nullptr,然后等待其生命周期结束后被栈空间回收即可。

倘若被分配了堆空间内存的指针在释放内存之前生命周期就完结了,那么该指针在栈空间上就会被回收,但其堆空间上释放的内存仍然不会被释放,而由于指针本身已经被回收,该进程便失去了对原指针所指的堆空间的内存的访问能力,该部分内存空间存在与进程却无法访问或释放,便是内存泄露,直到程序运行终止,进程所有内存均被操作系统回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值