数据结构(四) --- 内存与指针

        内存在程序角度上来讲,是一段连续的空间,以字节为单位,可以存储数据。对于每一个存储单位,都有对应的一个地址,谓之曰指针。程序使用的内存是有限制的,虽然现代硬件发展很快,但是内存的合理利用仍然是对优秀程序的要求。  
        01). 变量与常量。常量顾名思义是运行期间不变的数据,变量则是可以再运行期间被修改的。而指针变量存储的是指针,也就是一个内存的地址,一般是用整数来表示的。程序分配内存之后,往往需要记录两个参数,一个是其大小,一个是其地址,这样才能比较方便的操作分配出来的这块内存。
        02). 静态存储区。都是在程序编译连接阶段确定的,在程序执行的阶段不会改变,程序不需要关心它的分配与释放。只读数据区、以读写数据、BSS。
        03). 动态存储区。分堆与栈。都是程序执行的过程中动态分配的,大小也随之动态变化。栈上的内存比较珍贵,是程序自身控制,比如说局部变量,函数传递的参数等,这些由编译器确定,程序不需要关心它们的分配释放。而堆上的内存相对来讲速度慢一些,但是贵在容量比较大,它必须由程序显示的分配与释放。
        04). 数据结构的定义与使用。为了得到合理的使用内存,数据结构一定要合理的定义,避免分配超级大的内存,也避免太过频繁的分配与释放,要合理的利用组合的思想,让程序运行的时候,内存得到最大限度的利用。
        05). 内存的峰值。内存的峰值,是指程序在某一时刻需要的最大的内存的总和。内存峰值是看你的程序对内存的最大需求,程序猿要尽量避免大的内存峰值,这样不至于导致内存不足,引发一些其他的问题。
        06). 对内存数据存取的效率。分两个方面,一个是要合理利用内存的局部性原理,防止颠簸。另外一个是注意字节对齐,减少CPU访问内存的次数。
        07). 内存泄露。 申请一块内存,但没有释放,程序结束也没回收,导致其他程序不能使用。纯C的程序中,解决内存泄露的一个办法是简单的包装MALLOC,FREE,记录当前的内存情况。在程序退出的时候,进行排查。等测试稳定了,替换为系统的MALLOC,FREE函数。
        08). 越界操作。对于内存要进行操作,要记住内存的起始地址以及当前内存块的大小。要严格注意,只能操作当前内存块里的内存数据,不要进行越界操作。要时刻提防内存的越界操作,尤其是对数组进行索引的时候。
        09). 野指针。指一个内存指针已经被释放,但指针依然在使用。避免野指针的情况,将内存的指针置为NULL,并在程序使用的时候判断该内存是否为NULL,如为空,则认为该内存已经释放,不对内存进行访问。
       10). 栈溢出。栈溢出,是指在一些运行栈比较小的系统中,局部变量太大,或者函数调用次数太深,栈的空间不够而溢出。这样CPU就不知道自己到底运行到什么地方了,然后就胡乱执行指令,导致一系列问题。要注意不要定义太大的局部变量,函数调用次数不要太深,尤其是递归调用。
       11). 内存清零。有时候,分配内存之后没有赋值就使用了,这个时候, 内存里的数据是随机的。要注意内存在分配好了之后,使用MEMSET清零。这样,即使没有赋值,也不至于使用了随机的数据导致问题。
       12). 内存碎片。在一些系统中,如果太过频繁的MALLOC,FREE各种各样的数据结构,会导致内存的碎片,最后碎片太多,而无法分配内存了。防止内存碎片的一个办法是内存池。将一些频繁使用的内存先收集在一个容器里,使用的时候,直接容器里面查询。
       13). 内存不足。内存不足,是没有内存了。一般是由内存泄露引发,但是也有一些情况,比如系统本身的内存已经非常少了,导致内存不足。程序要对内存不足的情况进行处理以及保护,它是有可能发生的一种情况。
       14). 非法释放内存。两种情况,一个是多次FREE,要时刻注意,分配一次,只能释放一次;另外一个是释放不是MALLOC返回的地址。尤其是第二种情况,不小心改了地址的值(比如说p=malloc(20);p++;free(p);),再去释放,导致的问题非常复杂,要时刻注意。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值