On Wed, 7 Mar 2001, Kort, Eric wrote:
>After 3 iterations, this routine increases in runtime from 3 seconds to 6
>seconds. Eventually, memory runs out and a core dump occurs. I am using
>the same array reference for the return value for each call, so the problem
>is not that I am getting numerous arrays in memory (at least not on
>purpose).
>
>The function takes an array of image data (typically 512 x 512 pixels x 3
>samples per pixel = about 780,000 array elements), a channel (0=Red,
>1=Green, and 2=Blue), and turns all pixels blue if the pixel intensity in
>the desired channel was below threshold, returning a reference to a new
>array holding the masked image data.
>
>Using newRV_noinc instead of newRV_inc (as per the discussion in perlguts),
>I get lots of "attempt to free unreferenced scalar..." errors.
>
>Can someone help me identify the memory leak?
>
>Thanks,
>Eric
>
>---8<-----------------------------------------------------
>
>SV* tiffRGBThreshold(SV* svImage, int iChan, int iThresh)
>{
> AV *avImage, *avMask;
> int i, iImageA;
>
> avMask = newAV();
>
> //Extract and dereference perl array reference to AV*
> avImage = (AV*)SvRV(svImage);
>
> // calculate image size
> // (Need to add some error trapping here)
> iImageA = av_len(avImage);
> av_extend(avMask, iImageA);
>
> //Now loop through and turn pixels below threshold blue
> for (i=0; i<(iImageA + 1) / 3; i++)
> {
> if (SvIV(*av_fetch(avImage, i*3+iChan, 0)) < iThresh)
> {
> av_push(avMask, newSViv(0) );
> av_push(avMask, newSViv(0) );
> av_push(avMask, newSViv(255) );
> } else {
> av_push(avMask, (SV*)*av_fetch(avImage, i*3, 0) );
> av_push(avMask, (SV*)*av_fetch(avImage, i*3+1, 0) );
> av_push(avMask, (SV*)*av_fetch(avImage, i*3+2, 0) );
> }
> }
>
> //return reference to array holding mask image data
> return newRV_inc((SV*)avMask);
>}
>
As I see it.. I mighe be off here, but you create an array (avMask), with
a refcount of 1 and increases the refcount when returning the ref.
There if only one reference to it in ``perl space'', but count of 2.
maby newRV_noinc((SV*)avMask); would do it..
Yours
--
Morten Bøgeskov (email: [EMAIL PROTECTED])
We are the F.B.I ma'am. We don't have a sense of humor that we're aware of.
(Men in Black)