2014-02-12 29 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()的第三個參數變化釋放** –