[fpc-pascal] with no if assigned() there are bugs
Mark Morgan Lloyd
markMLl.fpc-pascal at telemetry.co.uk
Wed Sep 21 13:38:58 CEST 2016
On 21/09/16 11:00, Martin wrote:
> On 21/09/2016 09:05, Mark Morgan Lloyd wrote:
>>
>> Presumably this would be an assertion that something is assigned. A
>> related test is that an object is a specific subtype before using it
>> as such
>>
>> Assert(PageControl1.ActivePage.Controls[0] is TSynEdit);
>> syn := TSynEdit(PageControl1.ActivePage.Controls[0]);
>
> The problem is that even a test like that would NOT catch all cases.
>
> syn.destroy;
> Assert(syn is TSynEdit);
>
> In this case, it is very likely that "syn is TSynEdit" still returns
> true. (no assertion thrown)
Absolutely. But as you say later, anybody who doesn't use FreeAndNil()
is asking for trouble.
> Simply because "syn.destroy;" does not wipe the memory clean. (depending
> on mem manager)
>
> Using -gh
> And (optionally) setting the environment HEAPTRC="keepreleased" (that is
> for debugging only)
> http://www.freepascal.org/docs-html/rtl/heaptrc/environment.html
> will help.
>
> On top of that you can use -CR
>
> Also search suspected code for every "destroy" or "free" and, replace
> with FreeAndNil(var) if possible.
[From elsewhere a few years ago, somebody's wife looked over his
shoulder and saw his Delphi code full of Create and Destroy calls. "Bit
violent isn't it?" she remarked.]
--
Mark Morgan Lloyd
markMLl .AT. telemetry.co .DOT. uk
[Opinions above are the author's, not those of his employers or colleagues]
More information about the fpc-pascal
mailing list