C语言--内存管理

3/8/2017来源:ASP.NET技巧人气:1626

对于任何的操作系统来说,内存都是很宝贵的一个地方。所以,对于编程语言来说,内存管理就显得尤为重要。

C语言代码在内存中运行的时候,我们大致将占用的内存分为4块区域:代码区、静态区、栈区、堆区。这4各区域,有着各自的特点,他们也存储着我们的程序在运行中的不同类型的数据。弄明白了这4个区域的数据存储特点,也就对于内存管理有了差不多的认识了。

代码区:存放程序运行时的函数体的二进制代码,由操作系统进行管理。

静态区:全局变量和静态变量(static修饰的变量)存储的区域,当程序运行结束后由操作系统释放。

栈区:存放函数参数,局部变量,由编译器自动分配释放。

堆区:存储程序员用malloc和new申请的变量,这种是动态申请内存,在变量不再被使用时有程序员自行free和delete,若不处理,在程序执行完成后由操作系统回收。但是这样在程序结束之前,内存会一直被占用,浪费内存空间

从上面的总结来看,我们在使用内存的时候要注意几点:

1、动态分配内存时,要注意及时释放。

2、尽可能的不使用全局变量或静态变量。

3、代码简洁。

在实际开发中,出现内存问题是很麻烦的一件事情,编译器是不能自动发现这些错误的,在程序运行的时候才会被捕捉到。而且这类错误也是时隐时现的,很难修改。这样就要求我们在代码的编写过程中就要注意内存管理的问题。下面来说几个容易出错的情况:

1、使用了分配未成功的内存。

在我们申请内存的时候,会出现一种情况,那就是内存分配不成功。对于这种可能出现的问题,就要求我们在使用之前先去检查指针是否为空。如果是动态分配的内存,那么在使用之前先用if(p == NULL )判断。如果是作为函数的参数,使用assert(p != NULL)检查。

2、未对已经分配成功的内存初始化。

对于一个变量来说,如果没有初始化,那么内存的缺省初始值究竟是什么,这个没有标准的规定,有的时候为零,但也有的时候不为零,这样就会出现因为变量初始值而引发一些问题,这种问题只会体现在数据上,也是很难排查的。所以,给申请的变量赋初值是很有必要的。

3、内存越界。

这个问题最好也最多的体现是数组越界问题。这个就需要程序员自己去注意自己申请的空间了。

4、没有及时释放,导致内存泄漏。

需要程序员自己去释放的内存只有动态分配的堆区的内存,要管理好着一块的内存,使其不出问题,那么,内存申请和释放必须配对。只申请,不释放,内存一直被占用,这样总会有内存不够的时候。

5、内存已经被释放,还继续使用。

这个问题体现在,动态申请的内存被释放后,还继续使用的。函数返回指向栈区的指针。程序设计复杂,不知何时将内存释放了。第一种情况的解决还是在程序员本身,注意内存应在不再使用的时候释放。第二种情况,是因为栈区的只是一个暂存区,在函数结束的时候,内存就被回收了。第三种情况就需要重新设计数据类型了。

以上的5点,基本上已经体现了内存可能出现的问题,开发的时候一定要谨记。内存是很宝贵的资源,使用的时候一定要小心!小心!!再小心!!!

关于各种变量在内存中的表现的代码部分,这里给一个地址:http://blog.csdn.net/ic_tv/article/details/46718907。这里的代码写的很详细。