关于C/C++动态申请空间释放和内存泄漏问题介绍

1. 动态申请空间

1.1 基本内容

  Ⅰ 动态申请的空间没有具体名称,只能通过指针间接访问(无论new还是malloc方式)。
  Ⅱ 动态申请空间都是存放在堆中,有别于系统自动分配的空间是存放在堆栈中(即栈)。
  Ⅲ 栈中系统分配的空间,在使用结束会自动释放。而程序员动态申请的空间则需要人为来释放,否则随着程序运行,内存占用积累,很容易造成内存泄漏,尤其在程序过大,运行时间过长的时候,更需要这些每个细节问题。

1.2 常见空间申请方式

1.2.1 malloc/free申请空间

  malloc/free是声明在c语言stdlib.h(或者c++语言的 cstdlib)头文件中,调用的时候记得添加头文件。
  具体格式如下:   

#include<stdlib.h> 
int nLen =100;
char* pl;
pl=(char*)malloc(nLen*sizeof(char));//申请nLen长度的存储char类型大小的空间

free(pl);   //使用结束,释放空间 

  这里需要注意,空间申请的大小与形式,跟数据类型无关,它就是动态分配的一段地址。即malloc申请的空间是没有类型概念的,最后赋给具体指向哪种类型的指针,仅需强制转换到相应类型即可。
  例如:

char* pl = (char*)malloc(10 * sizeof(int));

  上面程序虽然申请了10个长度存储int类型大小的空间,但跟赋给指向char类型的指针并不存在矛盾,地址是没有数据类型概念的。

1.2.1 new/delete申请空间

  C中已经有了malloc/free,那为什么还需要new/delete呢?自然是前者不能满足c++中增加的关于类处理相关操作。
  由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够自动地调用构造函数和析构函数。即用无法满足动态对象的要求。因此 C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
  也就是说new既能申请类对象空间,也能调用构造函数。
  具体使用如下:

//变量
int* nNum = new int(5);   //注意申请简单变量,也必须使用指针形式

delete nNum;              //释放空间
nNum = NULL;              //让指针指向空指针,杜绝野地址
//一维数组
int* nNum1 = new int[5];  

delete []nNum1;            //释放空间,记住与变量不同
nNum1 = NULL;
//二维数组
int (*pl)[4]              //必须点明列大小
pl = new int[3][4];

delete []pl;
pl = NULL;

2. 动态申请空间内存泄漏问题

  每个程序都包含一或多个进程运行,而每个进程都有自己的进程堆。虽然程序中动态申请的空间如果没有手动释放,在程序运行结束,也就是所有进程消亡后,系统也会将进程中申请的所有的内存资源全部释放。但是如果一旦程序运行时间过程,或者程序占用内存过大,进程就会耗尽系统所有内存,最终造成内存泄漏。
  所以避免程序出现内存泄漏的最好办法是,当使用动态空间完毕后,我们应该人为释放内存空间。
  


个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!

转载请注明出处:CSDN 无鞋童鞋。

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值