У меня есть XSub вроде этого:Perl XS Handling Память Струны
Но это показывает, как утечка памяти, на New(), в Valgrind, и если я запускаю его в петлю резидента память будет продолжать расти.
я получаю то же самое, если я использую этот тоже:
char *
string2()
CODE:
char *str = strdup("Hello World2");
RETVAL = str;
OUTPUT:
RETVAL
Я в состоянии предотвратить утечку и увеличение объема памяти, выполнив:
char *
string3()
PPCODE:
char *str = strdup("Hello World3");
XPUSHs(sv_2mortal(newSVpv(str, 0)));
free(str);
, но проблема с это решение заключается в том, что при компиляции с -Werror я получаю следующие предупреждения/ошибки.
test.c: In function ‘XS_test_string3’:
/usr/lib/x86_64-linux-gnu/perl/5.20/CORE/XSUB.h:175:28: error: unused variable ‘targ’ [-Werror=unused-variable]
#define dXSTARG SV * const targ = ((PL_op->op_private & OPpENTERSUB_HASTARG) \
^
test.c:270:2: note: in expansion of macro ‘dXSTARG’
dXSTARG;
^
test.c:269:9: error: unused variable ‘RETVAL’ [-Werror=unused-variable]
char * RETVAL;
С файл будет построен с неиспользованной RETVAL:
XS_EUPXS(XS_test_string3); /* prototype to pass -Wmissing-prototypes */
XS_EUPXS(XS_test_string3)
{
dVAR; dXSARGS;
if (items != 0)
croak_xs_usage(cv, "");
PERL_UNUSED_VAR(ax); /* -Wall */
SP -= items;
{
char * RETVAL;
dXSTARG;
#line 61 "test.xs"
char *str = strdup("Hello World3");
XPUSHs(sv_2mortal(newSVpv(str, 0)));
free(str);
#line 276 "test.c"
PUTBACK;
return;
}
}
Так есть лучший способ справиться с возвращением выделенных строк в XS? Есть ли способ вернуть строку с помощью RETVAL и освободить память? Я ценю любую помощь.
Спасибо, что сработало. В секундах, что было бы правильным способом освобождения памяти? – gaijin
@gaijin Во втором примере вы можете освободить память только в пользовательской записи [typemap] (http://perldoc.perl.org/perlxstypemap.html). – nwellnhof