| Newsgroups |
perl.xs |
| Message-ID |
<[email protected]> |
Can't answer your leaking memory/reference count problem,
but please consider these points:
1. Generally when you iterate over a length, you want
for (i = 0; i < len_data; ++i) [not <=]
2. You're iterating i over the length of data. Are
you sure that odometer is long enough to support
GETIV(odometer, i) ??
Best of luck,
cmac
On Jan 28, 2011, at 2:06 AM, Xavier Noria wrote:
> Hi, this C function is leaking memory:
>
> AV* __next_subset(SV* data_avptr, SV* odometer_avptr)
> {
> AV* data = GETAV(data_avptr);
> AV* odometer = GETAV(odometer_avptr);
> I32 len_data = av_len(data);
> AV* subset = newAV();
> IV adjust = 1;
> int i;
> IV n;
>
> for (i = 0; i <= len_data; ++i) {
> n = GETIV(odometer, i);
> if (n) {
> av_push(subset, newSVsv(*av_fetch(data, i, 0)));
> }
> if (adjust) {
> adjust = 1 - n;
> SETIV(odometer, i, adjust);
> }
> }
>
> return subset;
> }
>
> I think the problem is the reference count of the AV*. Is that
> correct? How should I build/return it to prevent that?