This doesn't create any variables in perl space (I don't think) and I throw away the SV* returned by eval_pv. Watching memory use as it runs, this still leaks memory compiled agains perl 5.8.3 and 5.6.1. As an experiment, I tried eval_sv with:#include <EXTERN.h> #include <perl.h> static PerlInterpreter *my_perl; main (int argc, char **argv, char **env) { STRLEN n_a; int i; char *embedding[] = { "", "-e", "0" }; my_perl = perl_alloc(); perl_construct( my_perl ); perl_parse(my_perl, NULL, 3, embedding, NULL); perl_run(my_perl); for(i=0; i < 10000000; i++) { eval_pv("1", TRUE); } perl_destruct(my_perl); perl_free(my_perl); }
which leaks in the same way. However, if I use call_pv instead, this doesnt leak at all:#include <EXTERN.h> #include <perl.h> static PerlInterpreter *my_perl; main (int argc, char **argv, char **env) { STRLEN n_a; int i; SV* my_string; char *embedding[] = { "", "-e", "0" }; my_perl = perl_alloc(); perl_construct( my_perl ); perl_parse(my_perl, NULL, 3, embedding, NULL); perl_run(my_perl); my_string = newSVpv("2", 0); for(i=0; i < 10000000; i++) { eval_sv(my_string, TRUE); } perl_destruct(my_perl); perl_free(my_perl); }
This seems fairly fundamental, so I must missing something. In my application, it is possible that eval_pv be called a large number of times (hundreds of millions). Any ideas? Many thanks!#include <EXTERN.h> #include <perl.h> static PerlInterpreter *my_perl; main (int argc, char **argv, char **env) { STRLEN n_a; int i; char *embedding[] = { "", "-e", "sub fred {1;};" }; my_perl = perl_alloc(); perl_construct( my_perl ); perl_parse(my_perl, NULL, 3, embedding, NULL); perl_run(my_perl); for(i=0; i < 10000000; i++) { dSP; ENTER; SAVETMPS; PUSHMARK(sp); call_pv("fred", G_DISCARD); SPAGAIN; LEAVE; } perl_destruct(my_perl); perl_free(my_perl); }
In reply to memory leak in eval_pv? by lightspeed
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |