On 2006-03-23, at 15:22:01 +0000, Alberto Manuel Brandão Simões wrote: > Hi > > I am working with XS, and creating an array. It is basically something like: > > array = newAV(); > av_push(array, newSVuv(dictionary_get_occ(D, wid))); > > for (j = 0; j < MAXENTRY; j++) { > twid = 0; > prob = 0.0; > twid = dictionary_get_id(D, wid, j); > if (twid) { > prob = dictionary_get_val(D, wid, j); > tword = word_list_get_by_id(T, twid); > av_push(array, newSVpv(tword, strlen(tword))); > av_push(array, newSVnv(prob)); > } > } > RETVAL = newRV_noinc((SV*)array); > > The question is: the objects created here (newSVpv, newSVnv and the > array) are freed in case they are no more used?
Yes. :-) When in doubt, it's usually a good idea to check the reference counts with Devel::Peek: use Devel::Peek; $a = some_xsub_call(); Dump $a; For example: [EMAIL PROTECTED] ~ $ perl -MConvert::Binary::C -MDevel::Peek -e'$a = Convert::Binary::C->new->parse("typedef int a[];")->unpack("a", "x"x12); Dump $a' SV = RV(0x819ada0) at 0x8148fb4 REFCNT = 1 FLAGS = (ROK) RV = 0x8148e1c SV = PVAV(0x814dedc) at 0x8148e1c REFCNT = 1 FLAGS = () IV = 0 NV = 0 ARRAY = 0x81612e8 FILL = 2 MAX = 3 ARYLEN = 0x0 FLAGS = (REAL) Elt No. 0 SV = IV(0x815e80c) at 0x8148fd8 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 2021161080 Elt No. 1 SV = IV(0x815e810) at 0x8163e40 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 2021161080 Elt No. 2 SV = IV(0x815e814) at 0x8163df8 REFCNT = 1 FLAGS = (IOK,pIOK) IV = 2021161080 If all refcounts are 1, the objects will be freed as soon as the last reference to them ($a) vanishes. Marcus -- This file will self-destruct in five minutes.