Memory keeps accumulating

BlitzMax Forums/BlitzMax Programming/Memory keeps accumulating

Hardcoal(Posted May) [#1]
Hi. I have a process were I create an Element and than deletes it..
but it keeps accumulating memory.
I dont know what im doing wrong or not doing right..

When I create an Element


	Method DeleteClass_Req(Class:ClassExtender_Class)
	
		ListRemove(Class.ClassElement.ElementClasses, Class)
		
		Class.OnRemoving()	
		ClassManager.ReconnectClassFollowingParent(Class) 		'ReconnectClassFollowingParentClass

	   'Sub Classes Deletion
		Local SC:ClassExtender_Class
		For SC = EachIn Class.SubClasses
			DeleteClass_Req(SC)
			ListRemove(Class.SubClasses, SC)
		Next
		
	   'Data Cells Delete
		ClassManager.DataCells.Del.DeleteClassDataCells(Class)
		
		Class.SubClasses = Null
		Class.DataCells = Null
		Class.ClassAnswersList = Null
		Class.MessagesList = Null
		Class = Null
		
	End Method

	Method DeleteClassDataCells(Class:ClassExtender_Class)
		Local DC:DataCell_Class
		For DC = EachIn Class.DataCells
			ClassManager.DataCells.Del.DeleteDataCell(DC)
		Next
	End Method

	Method DeleteDataCell(DataCell:DataCell_Class)
		ListRemove(DataCell.ParentClass.DataCells, DataCell)
		DataCell = Null
	End Method


Type ClassExtender_Class

   'Identity
	Field Name:String 																'Private Name
	Field ClassTypeName:String				    									'The Offcial Name Recognizer
	Field info:String																'Info about the Command
	Field Location:String															'For MapEditor Available Classes Capture. (no need clone)
	Field Version:Float = 1															'Maybe Cancle//
	Field MadeBy:String = "Hardcoal"
	
   'Family
   
   	   'Element
		Field ClassElement:Element_Class											'The Element that this class belongs to
	
	   'SubClasses
	    Field SubClassParentClass:ClassExtender_Class
	    Field SubClasses:TList = CreateList()

   'DataCells
	Field DataCells:TList = CreateList()											'Class DataCells. The Parameters of Class 
	Field PEDC:DataCell_Class = ClassManager.AddDC_Element(Self)  					'The Played Element DataCell. [Must be After DataCells.] ClassManager.AddDC_Element is Add DataCell
	
   'Answers
	Field ClassAnswersList:TList = CreateList()
	
   'Messages
	Field MessagesList:TList = CreateList ()

   'Flags
   
	   'User Changable
		Field IsTrigger_flg															'Means this Class is also trigger other stuff Trig Shoud be Called IF_
		Field AsHitStyle_flg														'Continues or Hit.  for now its for triggers but will be used for all classes maybe
		Field AvoidClone_Flg							   							'If this is set on the the clone ElementClone Command will ignore this class in clonning.
		Field WorkOnce_Flg
		Field IsActive_flg = True
		Field AutoPlaySubClasses_flg = False
		Field ShowAnswerIcon_flg
		Field CanBeAddedTo_flgs = 255												'Which Element Type Can Add This

   'Followings Classes
	Field FollowingClass:ClassExtender_Class, FollowingClassName:String							'The Following Class 					
	Field FollowingClassOnTrue:ClassExtender_Class, FollowingClassOnTrueName:String
	Field FollowingClassOnFalse:ClassExtender_Class, FollowingClassOnFalseName:String
	
   'Alba Stuff
	Field FlowChartClassAlElement:ALElement_Cls													'The FlowChart Class Window
	Field FCXPos = 100																			'put fcxpos inside
	Field FCYPos = 100
	Field PropsClassListAL																		'The handle of Class Properties list
	
   'Temps
	Field Icon_Handle																			'This might be for mapeditor to be presented in flow chart..  'still under test
	Field SubClassHandle1
	Field SubClassHandle2
	Field TriggerHitStyleOn_flag
	Field TriggerShoot_Flg
	
	Method New()			 
		Self.PEDC.Name = DefaultAffectedElementDCName
	End Method

   'Abstracts
	Method PlayClass_Private:Object() Abstract	 		  										'The Class Play While Engine Run [Its object so it could return any value]
	Method OnBegin() Abstract 															'Before The Play Start.. This Runs Once [Maybe Happen twice should be checked!]
	Method OnStop() Abstract																	'When Play Game Stops
	Method OnAdding() Abstract																	'When Adding this class to a new Element
	Method OnRemoving() Abstract																'When Removing From An Element
	Method WhileEditorMode() Abstract      														'While Edit. Dont use stuff that cannot be removed so they wont stay after use.  Maybe ill make Editor premade element stuff for use.

   'Commands									 		 										'Maybe all commnads should be out side of class for faster copy.
	
		Method SetClassTypeName()																'Sets the Class Name	[a must]
			Self.ClassTypeName = TTypeId.ForObject(Self).Name()
			Self.Name = ClassTypeName										 					'Make Rename mechanism maybe.
		End Method
		
		Method TurnOffClass(Remark:String = "")  								 'maybe cancle
			Self.IsActive_flg = False
			If Remark <> "" Then DbgMsg Remark + " At " + Self.Name
		End Method

		Method DeleteMainElement()
			GE.Element.Del.DeleteElement(ClassElement)
		End Method

		Method TurnOnClass(Class:ClassExtender_Class)					 			'A general Class Turn on
			Class.IsActive_flg = True
		End Method

		Method RefreshClass(WaitMouseDown = True) 							 	 	'should not be here..
			ME.Class.CrntClass.RefreshCurrentClass(Self)
			If WaitMouseDown Then UserInput.WaitMouseDown()  						'ok
		End Method

		Method SubClassPlay()
			If Self.IsActive_flg Then PlayClass_Private()
		End Method
		
	   'Class Answers / Trigger  													'This is like giving an order to a class so yo can make lots of stuff..
	   	   
			Method ClassShootAndAnswer(Answer:Object = "OK")						'you can use trigger shoot to pass information to the next class
				Local ClassAnswr:ClassAnswer_Class
		
				If Answer = Null Then Return
				
				TriggerShoot_Flg = True												'maybe cancle
				
			   'Sends Answers To DataCells	
				For ClassAnswr = EachIn Self.ClassAnswersList
				
				   'Maybe ill make it shoot by type
					If ClassAnswr.DataCell <> Null Then
						ClassAnswr.DataCell.DataStrng = Answer.toString()
						ClassAnswr.DataCell.Element = Element_Class(Answer)
						ClassAnswr.DataCell.Value = Answer.toString().ToFloat()
					End If
					
				Next
				
			End Method

			Method ClassAnswerVal(Val:Float)
				Local ClassAnswr:ClassAnswer_Class
				
				TriggerShoot_Flg = True
			
				For ClassAnswr = EachIn Self.ClassAnswersList
					ClassAnswr.DataCell.Value = Val
				Next
				
			End Method

	  'Error
	   Method ClassError(ErrorMsg:String = " On Class")
	   		DbgMsg ("Class Error: " + ErrorMsg + " Disabling Class " + Self.Name)
	   		Self.IsActive_flg = False
	   End Method

End Type




here is some of my code.. Look at the delete Command and tell me please what am i doing wrong..
there must be a solution..


Hardcoal(Posted May) [#2]
Ok i kinda solved it by nulling something.
I don't understand why some inner stuff needed nulling and some don't

in this case it was
 PEDC:DataCell_Class =null  



col(Posted May) [#3]
I don't understand why some inner stuff needed nulling and some don't


Hiya,

I would think you have some cyclic links.
If you have parent -> child -> parent relationship ( which it looks like by browsing the fields of ClassExtender_Class) then the GC won't free them until the cyclic link is broken via setting one of them to null. It sounds and looks like that's what's happening here.