GAMAP tips and tricks: Difference between revisions
Line 16: | Line 16: | ||
Note if you do not call ctm_cleanup or call it with /No_GC, then the memory allocated by CTM_MAKE_DATAINFO is still allocated and the pointers that refers to it are alive... until you exit the routine (unless they are passed back). Once you are out of the routine, this memory remains allocated but is useless since unaccessible, in other words you have memory leak. | Note if you do not call ctm_cleanup or call it with /No_GC, then the memory allocated by CTM_MAKE_DATAINFO is still allocated and the pointers that refers to it are alive... until you exit the routine (unless they are passed back). Once you are out of the routine, this memory remains allocated but is useless since unaccessible, in other words you have memory leak. | ||
(3) So, if you want to keep some objects and/or pointers alive in your code (i.e., you do not want to call heap_gc or ctm_cleanup,/no_gc), you need to free only the created pointers as follows: | (3) So, if you want to keep some objects and/or pointers alive in your code (i.e., you do not want to call heap_gc or ctm_cleanup,/no_gc), you need to free only the created pointers as follows: |
Revision as of 16:07, 28 March 2008
Memory management and CTM_MAKE_DATAINFO
When using CTM_MAKE_DATAINFO, you create few pointers and allocate memory to pointed data. Three scenarios to free that memory are possible.
(1) By default, GAMAP keeps track of the pointers in a global structure, and you can clean up the memory by calling CTM_CLEANUP (with or without the keyword /NO_GC):
ctm_make_datainfo(data, ...) CTM_WriteBpch, DataInfo, FileInfo, FileName=file ctm_cleanup
(2) If you use the keyword /NO_GLOBAL when calling CTM_MAKE_DATAINFO, the story is a little bit more subtle. Now, GAMAP has no idea of the created pointers. If you use CTM_CLEANUP without the keyword /NO_GC, everything is clean up because there is a call to heap_gc. But you are also loosing **all other** pointers and objects.
ctm_make_datainfo(data, ..., /No_global) CTM_WriteBpch, DataInfo, FileInfo, FileName=file ctm_cleanup
Note if you do not call ctm_cleanup or call it with /No_GC, then the memory allocated by CTM_MAKE_DATAINFO is still allocated and the pointers that refers to it are alive... until you exit the routine (unless they are passed back). Once you are out of the routine, this memory remains allocated but is useless since unaccessible, in other words you have memory leak.
(3) So, if you want to keep some objects and/or pointers alive in your code (i.e., you do not want to call heap_gc or ctm_cleanup,/no_gc), you need to free only the created pointers as follows:
ctm_make_datainfo(data, datainfo, fileinfo, ..., /No_global) CTM_WriteBpch, DataInfo, FileInfo, FileName=file ptr_free, DataInfo.data ptr_free, fileinfo.gridinfo
To free only the heap memory created by multiple calls to CTM_MAKE_DATAINFO, the procedure is:
for D=0L, NTracers-1L do begin Success = CTM_Make_DataInfo( Data[*,*,D], DataInfo, FileInfo, ..., /No_Global ) ArrDataInfo = D eq 0l ? [ DataInfo ] : [ ArrDataInfo, DataInfo ] if D ne Ntracers-1l then ptr_free, Fileinfo.gridinfo endfor CTM_WriteBpch, ArrDataInfo, FileInfo, FileName=OutFileName for d=0, n_elements(ArrDataInfo)-1l do ptr_free, ArrDataInfo[d].data ptr_free, fileinfo.gridinfo
--Phillipe Le Sager 2008/02/13 10:28