Solved

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

Posted on 2003-10-22
5
226 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

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Suggested Solutions

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This video discusses moving either the default database or any database to a new volume.
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…

758 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

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now