关于内存

来源:互联网 发布:北京二手淘宝市场 编辑:程序博客网 时间:2024/05/02 04:41

一,原理 

  1. 总体来讲,内存分配有两种,静态和动态,动态又有在stack上分配和再heap上分配两种。
  2. 动态分配指程序运行开始就分配好的内存,常常是static和一些全局变量。他们在程序运行期间一直占据内存,直到程序结束释放。
  3. stack上动态分配。程序块体(如函数,{}内的代码)内部定义的变量都属这种情况,他们在定义是分配内存,块结束时释放内存。这个过程有编译器自动实现,程序员不用负责。
  4. heap上动态分配,这是由程序员自己负责内存管理的情况,也是最需要注意的东西。即new/deletemalloc/free。这样产生的内存空间将会由程序员自由决定,当然也可能出现泄露。

二,原则

 

  1. 无论如何,new/deletemalloc/free一定要成对的使用。
  2. 指针申明的时候尽量顺便将其定义为NULLdelete或者free后也尽量这样做。正常来讲,delete或者free后不做也没有什么大问题,问题在于你有可能在已经delete或者free后还去用那个指针指向的内容(野指针)。
  3. 有些时候,为了方便,你可能会在某个函数内部new或者malloc一块内存,但是该函数运行结束后,你还要用到该内存,即你不能在函数结束的时候delete或者free一下,而要留到其他某个时候。理论上讲这是可行的,但不可信。我就上过恶当,切忌!
  4. 比较新的操作系统和一些IDE支持内存垃圾回收机制。但是不要以为这就万事大吉了,实际上操作系统也只能是在程序运行结束之后才能收回泄露掉的内存资源,而你的服务器程序可能需要永远跑着的。一些服务器每隔一段时间就Down掉了,这是其中最重要的原因之一。

三,注意

 

  1. VC6.0中奇怪的东西:

for(int i = 0; i < 10; ++i){

}

for(int i = 0; i < 20 ; ++i){

}

这是编译不通过的,错误在于i出现了重复定义,将第二段循环修改如下:

for(i = 0; i < 20; ++i){

}

ok了,这就是VC的特性之一。标准C++是不会出现这种错误的。

 

  1. 看这条语句:

Int a[1000000000];

编译不通过,原因在于stack空间不够。显然系统的栈空间是有限的,不能这样不限制的分配。一般来讲,如果你要求的内存空间比较大是,都采用在heap上动态分配的方法,这纵情况下这要你内存空闲的足够大,就不会发生问题,但一定要注意释放。

 

 

 

  1. 在看这条:

Int *p = (int*)Malloc(0);

注意,编译是丝毫没有问题的。而且你可以将p指针printf出来看,并不是空值NULL。但不要以为p指针就真的分配空间了,ANSI C中说明了这种情况是没有定义的。

原创粉丝点击