edan has asked for the wisdom of the Perl Monks concerning the following question:
If I mortalize the "AV" (commented line below), I get "Attempt to free unreferenced scalar". But If I don't, I'm leaking memory, as evidenced by Devel::Leak (though for some reason it isn't telling me that the AV is left around, rather the SV containing the name of the subroutine being called, "MyModule::test" in the below code - weird). It seems like I should be mortalizing it, but I can't figure out why it's getting "over-decremented" when I do.
dSP; ENTER; SAVETMPS; PUSHMARK(SP); AV *arr = newAV(); // AV *arr = (AV *) sv_2mortal((SV *) newAV()); av_push( arr, sv_2mortal(newSVpv("test", 0))); XPUSHs(sv_2mortal(newRV((SV *)arr))); PUTBACK; call_sv(sv_2mortal(newSVpv("MyModule::subroutine", 0)), G_SCALAR); SPAGAIN; SV *retval = POPs; PUTBACK; FREETMPS; LEAVE;
Can someone help clear this up for me, please?
Update: I have tinkered some more, and found a formula that seems to work, but I don't understand why. The following sub-snippet appears to work:
AV *arr = (AV *) sv_2mortal((SV *) newAV()); av_push( arr, newSVpv("test", 0));
So I'm not supposed to mortalize the scalars that I push onto the array? Why is that? It makes my problem disappear, which I like, but I don't understand it, which I don't like. Any further thoughts are appreciated.
|
---|