[fpc-pascal] How are Assigned, Free, Nil and Destroy related?

tcoq at free.fr tcoq at free.fr
Sat Oct 22 09:53:49 CEST 2011


Hello,
Instead of .Free in your FreeVars routine, you should use FreeAndNil( theobject).

The correct lifecycle for class objects is :
var
  anObject : TMyObject;
begin
  anObject := nil; //not needed for class attributes. Required for local function or global unit variables.
  anObject := TMyObject.Create( params) //if an exception is raised here, the anObject reference will still be nill.
  try
    //... do some code on anObject...
  finally
    FreeAndNil( anObject); //after this, the memory referenced by anObject is freed, and the reference anObject is set to nil.
  end;
end;

Hope this helps,
Thierry

----- Mail Original -----
De: "Frank Church" <vfclists at gmail.com>
À: "FPC-Pascal users discussions" <fpc-pascal at lists.freepascal.org>
Envoyé: Samedi 22 Octobre 2011 09h08:17 GMT +01:00 Amsterdam / Berlin / Berne / Rome / Stockholm / Vienne
Objet: Re: [fpc-pascal] How are Assigned, Free, Nil and Destroy related?





On 22 October 2011 07:20, Felipe Monteiro de Carvalho < felipemonteiro.carvalho at gmail.com > wrote: 


I understand Assigned as being the same as <> nil, so Assigned(Object) 
= Object <> nil 

I vaguely remember that it could be safer in some corner case, but I 
don't remember ever meting that. 

Free is how you release the memory allocated for a object. Free calls 
Destroy. Never call Destroy manually. When you implement the 
destructor you always implement Destroy, never change Free. 

Nil is not a routine, it is a value, it means that the object is 
empty, it does not exist / is not allocated. Nil in existing 
implementations that I know is represented by the value zero. 

The typical life-cycle of a object is: 

MyObject := TMyObject.Create; 
try 
MyObject.DoSomething(); 
finally 
MyObject.Free; 
end; 

To implement this object you should implement Create, DoSomething and Destroy. 

-- 
Felipe Monteiro de Carvalho 
_______________________________________________ 
fpc-pascal maillist - fpc-pascal at lists.freepascal.org 
http://lists.freepascal.org/mailman/listinfo/fpc-pascal 

This code is the source of my woes. SCStrings and FBreakStrings are part of an object. They are repeatedly used in a loop and I need to free the memory after the loop runs or free the space taken up by their strings 



type 
TRuntimeMonitor = class(TThread) 
private 
Frequency: Integer; 
IniFile: TMemIniFile; 
SCStrings: TStringList; 
FBreakStrings: TStringList; 
procedure DispatchOutput; 
procedure DisplayRawOutput; 
protected 
procedure Execute; override; 
public 
constructor Create(CreateSuspended: Boolean); 
end; 



procedure InitVars; 
begin 
if not Assigned(SCStrings) then 
SCStrings := TStringList.Create; 
if not Assigned(FBreakStrings) then 
FBreakStrings := TStringList.Create; 

IniFile := TMemIniFile.Create('zxtyu'); 
end; 


procedure FreeVars; 
begin 
IniFile.Free; 
if Assigned(SCStrings) then 
SCStrings.Free; 
if Assigned(FBreakStrings) then 
FBreakStrings.Free; 
if Assigned(FBreakStrings) then 
debugln('FBreakStrings is still assigned'); 

end; 


InitVars and FreeVars run in the Execute procedure of the thread 

When the loop runs again Assigned in InitVars is false so as soon as those FBreakStrings and SCStrings are accessed within the loop a SIGSEGV occurs. So what I want to know is whether Assigned remains true when Free is executed. 

In the mean time instead of using Free in FreeVars I will set the text property to the blank string to release the memory used by the strings. 
-- 
Frank Church 

======================= 
http://devblog.brahmancreations.com 

_______________________________________________
fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal



More information about the fpc-pascal mailing list