2012-03-30 13 views
1

swigでラップされたPHP拡張モジュールでメモリリークが発生しました。swigでラップされたPHP拡張モジュールのメモリリーク

ZEND_NAMED_FUNCTION(_wrap_ArrayBase_get) { 
    ArrayBase *arg1 = (ArrayBase *) 0 ; 
    long arg2 ; 
    zval **args[2]; 
    zval *result = 0 ; 

    SWIG_ResetError(); 
    if(ZEND_NUM_ARGS() != 2 || zend_get_parameters_array_ex(2, args) != SUCCESS) { 
    WRONG_PARAM_COUNT; 
    } 

    { 
    if(SWIG_ConvertPtr(*args[0], (void **) &arg1, SWIGTYPE_p_ArrayBase, 0) < 0) { 
     SWIG_PHP_Error(E_ERROR, ""); 
    } 
    } 

    if(!arg1) SWIG_PHP_Error(E_ERROR, "this pointer is NULL"); 

    /*@SWIG:/usr/local/share/swig/2.0.2/php/utils.i,7,[email protected]*/ 
    convert_to_long_ex(args[1]); 
    arg2 = (long) Z_LVAL_PP(args[1]); 

    { 
    try { 
     result = (zval *)((ArrayBase const *)arg1)->get(arg2); 
    } catch (PHPIteratorException& phpExcep){ 
     //nothing to do, exception already created... 
    } 
    { 
    if (result != NULL){ 
     ZVAL_ZVAL(return_value,result,0,0); 
    } 
    } 
    return; 
fail: 
    SWIG_ZEND_ERROR_NORETURN(SWIG_ErrorCode(),"%s",SWIG_ErrorMsg()); 
} 

コール:

は、以下の機能を検討し

result = (zval *)((ArrayBase const *)arg1)->get(arg2); 

初期化をしてzvalをを設定しますが、このメモリは解放されることはありません。 zvalの初期化方法は、プリミティブ型のためにArrayBaseの子クラスによって異なる場合があります。たとえば、ロングタイプのゲッターは、次のようなものになります。

zval* return_value; ALLOC_ZVAL(return_value); ZVAL_LONG(return_value, l);return return_value; 

どうすればこのメモリを解放できますか?呼び出される必要があるzendマクロはありますか? これは新しいバージョンで解決されたかもしれないswigの問題ですか? 私はSWIGバージョン2.0.2を使用しています。

+0

を渡します。 getter関数の呼び出しを見るためにページソースを見てください。 – user1302792

答えて

0

私はzval型マッピング関数をswigに固定することでこの問題を解決することができました。入力zvalに対してFREE_ZVAL関数を呼び出します。

//のzvalの型マップは* - ラッパー関数の一部は、HTMLで正しく表示されないいくつかの理由...まっすぐにし、アウト

%typemap(out) zval* 
{ 
    if ($1 != NULL){ 
     ZVAL_ZVAL(return_value,$1,0,0); 
     FREE_ZVAL($1); 
    } 
}