Re: Catalyst CatDestroyDefaults [message #66978] |
Sun, 28 June 2009 07:09 |
David Fanning
Messages: 11724 Registered: August 2001
|
Senior Member |
|
|
David Fanning writes:
> It is probably appropriate that this comes on the heels of
> another discussion a week or so ago about the inability of
> UNDEFINE to undefine everything. And the reason for the problem
> is similar. It never occurred to me to store a heap variable
> in a Catalyst default value. ;-)
>
> But, now I know someone wants to do that, the solution is simple.
> If the internal pointer points to a heap variable, destroy that, too.
> And since I already spent an hour getting UNDEFINE to do just that
> a week ago, I decided to use that to get the job done.
>
> So, be sure you have the latest UNDEFINE, and you can download
> a new CatListValue object here:
>
> http://www.dfanning.com/programs/undefine.pro
> .../programs/catalyst/source/core/catlistvalue__define.pro
>
> Tested only lightly, as I am late for work, as usual. :-)
Whoops! Should have tested this more extensively for the
Law of Unintended Consequences. :-(
It was a good idea, in theory, but it had trickle down
effects in other parts of Catalyst. The most sensible course
seems to me to keep the underlying behavior the same,
but to allow different behavior by means of a keyword.
(Almost *always* the most sensible course, but I do not
always think clearly before the coffee kicks in.)
Thus, three Catalyst routines have changed to support a
DESTROY_ON_CLEANUP keyword to the CatListValue object.
If this keyword is set, the IDL variable stored in the
CatListValue storage location is destroyed with UNDEFINE
when the CatListValue object is destroyed.
The same keyword is available now for CatSetDefault, so
that you can destroy variables when default variables are
cleaned up. The following code will prevent memory leakage
when storing an object as a Catalyst default value.
pb = Obj_New('ProgressBar')
CatSetDefault, 'ProgressBar', pb, /DESTROY_ON_CLEANUP
CatDestroyDefaults
The following three routines have changed:
.../catalyst/source/utilities/catsetdefault.pro
.../catalyst/source/core/catlist__define.pro
.../catalyst/source/core/catlistvalue__define.pro
Documentation of this keyword is pretty extensive, but
please ask questions if you are not clear about it.
Cheers,
David
--
David Fanning, Ph.D.
Fanning Software Consulting, Inc.
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Sepore ma de ni thui. ("Perhaps thou speakest truth.")
|
|
|
Re: Catalyst CatDestroyDefaults [message #67087 is a reply to message #66978] |
Tue, 23 June 2009 06:26  |
David Fanning
Messages: 11724 Registered: August 2001
|
Senior Member |
|
|
Crane writes:
> I am trying to use CatSetDefault to set some of my system settings,
> for instance:
>
> oLang = Obj_New('languageclass')
> CatSetDefault, 'language', oLang
>
> When my application is destroyed, the CatDestroyDefaults is called
> automatically, I expected this procedure will clean up all system
> settings, so I did not destroy the oLang object by myself.
> Unfortunately, oLang is not cleaned up, it is still in memory. Should
> I have to explicitly destory the system settings in cleanup method ,
> or where am I wrong?
>
> I try to find what happens using debug mode, and know the
> CatDestroyDefaults procedure finally go to the CatContainer::Cleanup
> method, this method remove all child objects so they don't get
> destroyed automatically, I think this is why oLang is not destroy.
>
> I do not understand this, because we need CatDestroyDefaults to
> automatically destroy all the system settings when we destroy the
> application.
It is probably appropriate that this comes on the heels of
another discussion a week or so ago about the inability of
UNDEFINE to undefine everything. And the reason for the problem
is similar. It never occurred to me to store a heap variable
in a Catalyst default value. ;-)
But, now I know someone wants to do that, the solution is simple.
If the internal pointer points to a heap variable, destroy that, too.
And since I already spent an hour getting UNDEFINE to do just that
a week ago, I decided to use that to get the job done.
So, be sure you have the latest UNDEFINE, and you can download
a new CatListValue object here:
http://www.dfanning.com/programs/undefine.pro
.../programs/catalyst/source/core/catlistvalue__define.pro
Tested only lightly, as I am late for work, as usual. :-)
Cheers,
David
--
David Fanning, Ph.D.
Fanning Software Consulting, Inc.
Coyote's Guide to IDL Programming: http://www.dfanning.com/
Sepore ma de ni thui. ("Perhaps thou speakest truth.")
|
|
|