2014-02-12 24 views
3

我做了一个PHP扩展,它看起来像:内存泄漏使用malloc在PHP扩展

PHP_FUNCTION(function_name) 
{ 
    ... 
    proc_data = (char *)malloc(length); 
    ... 
    RETURN_STRINGL(proc_data, length, 1); 

} 

函数名是,这将是在PHP代码中的函数,它返回一个字符串。但是这个字符串是使用malloc分配内存的,它会自动释放还是我必须做些什么。我知道emalloc,但如果我使用它会有什么不同?

有没有更好的方法来做到这一点?

回答

5

emalloc()使用php's own memory allocator(这是针对php的工作负载进行优化,并强制最大的内存使用量)。

应该使用emalloc()如果可能的话,你必须使用它,如果PHP可以释放或重新分配内存区域。

RETURN_STRINGL()的第三个参数指定它是应该返回字符串的副本还是直接返回原始字符串。

在前一种情况下,PHP不会触及原始字符串,因此您可能必须自行释放它。

在后面的例子中,PHP成为字符串的所有者。当返回的变量不再使用/可达时,它将使用efree()释放原始字符串,所以字符串必须已分配emalloc()

如果你自己分配的变量,你应该emalloc()分配它,并通过0RETURN_STRINGL()

RETURN_STRINGL(proc_data, length, 0); 

如果变量是由一些库分配的,你需要释放它,这样做:

// RETVAL_STRINGL lets you set the return value, and then do anything before 
// actually leaving the function 
RETVAL_STRINGL(proc_data, length, 1); 
free(proc_data); 
return; 
+0

谢谢:) 如果使用** malloc()**而不是** emalloc()**分配内存,那么内存会发生什么? 将它与** RETURN_STRINGL()的第三个参数变化释放** –