Solved

a Free procedure call doesn't free (and nil) an object

Posted on 2003-10-22
5
231 Views
Last Modified: 2010-04-05
hi everyone,

i have the following problem :
i've created a TTimer descendent the following way :

interface

  TMyTimer = Class(TTimer)
                    ... various variables and TList Objects...
              public
                    constructor Create(aowner : TComponent);override;
                    destructor destroy; override;
              end;

var MyTimer : TMyTimer;

constructor TPopUpCampagne.Create(AOwner : Tcomponent);
Begin
     inherited Create(AOwner);
     ... several initializations including OnTimer affectation ...
End;

destructor TPopUpCampagne.destroy;
begin
     ... stuff to free memory...

     inherited destroy;
End;

then, further in the source code, i do the following (i want to destroy MyTimer to re-create it - instead of updating its data) :

if Assigned(Mytimer) then
   MyTimer.free;

...

MyTimer:=TMyTimer.Create(Nil);

the problem is that after the free call, the variable MyTimer isn't Nil - as expected ! but is still pointing to an existing object (and then my program throws an exception on another operation).

i've run the debugger and all the free calls in the object hierarchy are done.

Does anyone have an idea about what's happening ? and does anyone have a workaround ?
i could recreate the variable with the MyTimer:=TMyTimer.Create(Nil); but then i would have a memory leak...


thanks in advance,

Guillaume

PS : i put 150 points, cause it's important and i need a quick answer...
0
Comment
Question by:fsurfer
  • 4
5 Comments
 
LVL 27

Accepted Solution

by:
kretzschmar earned 150 total points
ID: 9597806
instead of

if Assigned(Mytimer) then
   MyTimer.free;

use

if Assigned(Mytimer) then
   FreeAndNil(MyTimer);

meikl ;-)
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 9597824
just for eplanation

>the problem is that after the free call, the variable MyTimer isn't
>Nil - as expected !

the referenceVariable is never set to nil after calling the free-method,
thats a normal bahaviour, you as developer have to care about this

meikl ;-)
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 9597853
btw. your timer is freed
0
 

Author Comment

by:fsurfer
ID: 9598092
Thanks for the answer !

it works perfectly !

i've always believe that free was doing a FreeAnd Nil....hmmmm there're always things to learn :)

Guillaume
0
 
LVL 27

Expert Comment

by:kretzschmar
ID: 9598159
glad to helped you ;-)
0

Featured Post

Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
A short tutorial showing how to set up an email signature in Outlook on the Web (previously known as OWA). For free email signatures designs, visit https://www.mail-signatures.com/articles/signature-templates/?sts=6651 If you want to manage em…

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question