2012-09-09 39 views
0

我正在写一些PHP扩展作为个人项目。 (我过去几十年前专业地使用C来开发实时和过程控制应用程序,所以对于总是检查内存分配器返回值并确保错误路径不会泄漏内存,我有些偏执狂,但随后出现了C++和。异常处理),现在我有一个简单的问题:emalloc的测试返回状态

我是否还是不要我需要做buf后一个NULL检查:

buf = emalloc(rec->len); 

通常在FLOSS项目,我只想用现有的源作为模板来回答这种问题,但PHP扩展不一致。静态分析复杂的C预处理代码是不切实际的,我只能轻松测试我自己的LAMP堆栈。就我所见,emalloc代码确实会在堆耗尽时调用zend错误例程,但代码会继续并返回0.某些扩展代码实例检查是否返回NULL,但您也可以在的ext/standard/string.c中找到示例,例如:

if (p_ret) { 
    ret = emalloc(len + 1); 
    memcpy(ret, comp, len); 
    ret[len] = '\0'; 
    *p_ret = ret; 
} 

,这将产生一个硬内存异常,如果emalloc不会返回而不是抛出一个Zend例外。

如果有人知道官方PHP开发人员的答案,我会很感激。谢谢。

+2

该emalloc函数的文档对此有何评论? – Mat

+0

您可以尝试通过尝试分配大量内存来创建这种情况:'emalloc(99999999999)'(必要时添加更多9)。 – Lekensteyn

+0

@Mat,我错过了**解开**指出的一句话。我对FLOSS项目的经验(我只贡献了4项)是这样的文档很少或根本不存在。开发人员不打扰,并且您希望从代码检查中重新设计这一点。覆盖整个基本MM系统的[一页](http://php.net/manual/en/internals2.memory.management.php)优于平均水平。 – TerryE

回答

2

The documentation明确规定:

注:不像他们的C标准库的同行中的问题的情况下,Zend引擎的内存管理功能将不会返回NULL而分配请求的内存,但保释出来,并终止当前请求。

+0

非常感谢。我在这个单页中错过了这个笔记。抛弃我的是,实际上一些e *例程包含以'return 0;'或'return NULL'结尾的延续路径;如果引擎引发内存耗尽错误,为什么会这样呢? – TerryE