in reply to Re^3: perlembed: mortalize an AV, get "Attempt to free unreferenced scalar" - don't mortalize, leaks memory
in thread perlembed: mortalize an AV, get "Attempt to free unreferenced scalar" - don't mortalize, leaks memory

You probably actually wanted a more recent copy of the source. av_clear doesn't free the memory allocated to the array nor does it free the SVs that form its elements. It simply truncates the array.

/J\

  • Comment on Re^4: perlembed: mortalize an AV, get "Attempt to free unreferenced scalar" - don't mortalize, leaks memory
  • Download Code

Replies are listed 'Best First'.
Re^5: perlembed: mortalize an AV, get "Attempt to free unreferenced scalar" - don't mortalize, leaks memory
by demerphq (Chancellor) on Jul 11, 2006 at 09:57 UTC

    nor does it free the SVs that form its elements

    moron is partially correct, it does free the SV's that form its elements. Although indirectly via refcount decrement. Thats what the follow code does:

    while (index) { SV * const sv = ary[--index]; /* undef the slot before freeing the value, because a * destructor might try to modify this array */ ary[index] = &PL_sv_undef; SvREFCNT_dec(sv); }
    ---
    $world=~s/war/peace/g

Re^5: perlembed: mortalize an AV, get "Attempt to free unreferenced scalar" - don't mortalize, leaks memory
by Moron (Curate) on Jul 10, 2006 at 14:44 UTC
    Amended accordingly (studying the version you cite av_clear appears to have been renamed to Perl_av_clear and the new av_clear has another purpose).

    -M

    Free your mind

      Er, in the perl API all the public functions are defined as Perl_<whatever> and documented without the Perl_ prefix, they are also available without the prefix through macros defined in embed.h. This was the case equally for the 5.6 MacPerl source that you originally looked at. I pointed you at the APC repository not because there was any particular difference in that function (except for some tidying and type changes they are largely identical between the two versions,) but simply because the MacPerl source you pointed to is more than four years old and based on the 5.6 source, whereas the APC reflects the current versions of Perl.

      /J\

      A reply falls below the community's threshold of quality. You may see it by logging in.