Karim Belabas on Mon, 20 Aug 2018 11:47:20 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Using lazy vectors in library mode |
* Jeroen Demeyer [2018-08-20 10:28]: > I have a question about using "lazy vectors" such as ell structures. > > It seems to me that the usual programming model manipulating avma may lead > to memory leaks with such structures. So one should call obj_free() on an > elliptic curve before resetting avma. Yes. t_LISTs present analogous problems. > However, it seems difficult to automate this: as far as I know, a program > cannot know that ellinit() returns a lazy vector. So I wonder how GP and > GP2C deal with this. I am asking this in the context of the Python > interface, where this is probably giving memory leaks currently. GP deals with it properly when structures are stored in GP variables: when a variable goes out of scope or when we store a new value, the old value is destroyed (gunclone_deep(); see e.g. changevalue). Which in particular recovers the memory used in the "lazy" components, without explicitly calling obj_free(). Whenever the initialization is "inlined", however, a memory leak occurs: ellgroup( ellinit([0,1],Mod(1,5)) ); \\ DEPRECATED: leaks memory... because the above garbage collector no longer handles the object created by ellinit, in which ellgroup stored the group structure. (11:43) gp > \gm3 debugmem = 3 (11:43) gp > { print(getheap()); ellgroup(ellinit([0,1],Mod(1,5))); print(getheap()); } [24, 2306] new block, size 3 (no 36): 7fbab344ea68 new block, size 11 (no 37): 7fbab344eaa8 [26, 2330] new block, size 2 (no 38): 7fbab344eb28 Two blocks (36 and 37) are lost for a total of 14 bytes. Cheers, K.B. -- Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17 Universite de Bordeaux Fax: (+33) (0)5 40 00 21 23 351, cours de la Liberation http://www.math.u-bordeaux.fr/~kbelabas/ F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP] `