2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 关于C/C++动态申请空间释放和内存泄漏问题介绍

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

时间:2018-11-25 10:15:01

相关推荐

关于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 无鞋童鞋。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。