background image

深入探讨 PHP 中内存管理问题

一、内存
  
  在 PHP 中,填充一个字符串变量相当简单,这只需要一个语句""即可,并且该字符
串 能 够 被 自 由 地 修 改 、 拷 贝 和 移 动 。 而 在 C 语 言 中 , 尽 管 你 能 够 编 写 例
如"char*str="helloworld";"这样的一个简单的静态字符串;但是,却不能修改该字符串,
因为它生存于程序空间内。为了创建一个可操纵的字符串,你必须分配一个内存块,并且
通过一个函数(例如 strdup())来复制其内容。
  
  以下为引用的内容:
  
  {
  
  char*str;
  
  str=strdup("helloworld");
  
  if(!str){
  
  fprintf(stderr,"Unabletoallocatememory!");
  
  }
  
  }
  
    由 于 后 面 我 们 将 分 析 的 各 种 原 因 , 传 统 型 内 存 管 理 函 数 ( 例 如
malloc(),free(),strdup(),realloc(),calloc(),等等)几乎都不能直接为 PHP 源代
码所使用。
  
  二、释放内存
  
  在几乎所有的平台上,内存管理都是通过一种请求和释放模式实现的。首先,一个应
用程序请求它下面的层(通常指"操作系统"):"我想使用一些内存空间"。如果存在可用的
空间,操作系统就会把它提供给该程序并且打上一个标记以便不会再把这部分内存分配
给其它程序。
  
  当应用程序使用完这部分内存,它应该被返回到 OS;这样以来,它就能够被继续分
配给其它程序。如果该程序不返回这部分内存,那么 OS 无法知道是否这块内存不再使用
并进而再分配给另一个进程。如果一个内存块没有释放,并且所有者应用程序丢失了它,
那么,我们就说此应用程序"存在漏洞",因为这部分内存无法再为其它程序可用。
  
  在一个典型的客户端应用程序中,较小的不太经常的内存泄漏有时能够为 OS 所"容
忍",因为在这个进程稍后结束时该泄漏内存会被隐式返回到 OS。这并没有什么,因为