Утечка памяти в расширении php, завернутая в swig - PullRequest
1 голос
/ 30 марта 2012

У меня утечка памяти в расширении PHP, завернутом в swig.

Рассмотрим следующую функцию:

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,CONVERT_INT_IN@*/
  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 версии 2.0.2.

1 Ответ

0 голосов
/ 10 апреля 2012

Мне удалось решить эту проблему, исправив функцию отображения типов zval в swig.Я вызываю функцию FREE_ZVAL на входе zval.

// Введите карты для zval * - передавайте их прямо внутрь и наружу ...

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