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

Frank Church vfclists at gmail.com
Sat Oct 22 09:08:17 CEST 2011


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20111022/7e7b5798/attachment.html>


More information about the fpc-pascal mailing list