[fpc-pascal] Problem with objects

Lukasz Sokol el.es.cr at gmail.com
Wed Dec 23 16:24:45 CET 2015


On 23/12/15 09:37, Santiago Amposta wrote:
> Hello:
> I use fpc 2.6.4 and I have a problem of memory leaks, strange errors,
> etc. Finally I have tracked it to this:
> 
> TSimpleArrayString=object
>     List:array of String;
> end;
> 
> TDerivedArrayString=object(TSimpleArrayString)
>     other_field:integer;
> end;
> 
> procedure TestSimple;
> var
>  A:TSimpleArrayString;
> begin
>   setLength(A.List,0);
> end;
> 
> procedure TestDerived;
> var
>  A:TDerivedArrayString;
> begin
>   setLength(A.List,0);
> end;
> 
> 
> TestSimple; // Works Fine,
> TestDerived; // rises an exception SIGSEGV on setLength
> 
> What am I doing wrong?
> 
I might be wrong... but I just tried:

stepping into TestSimple in the order OP specified,
hovering over A.List (actually over .List only, see below*)
gives 
  A.List = (0x0)
before setLength

and 
  A.List = ()
after the setLength;

then stepped through to TestDerived,  in which the hover over .List gives

A.List = ()

before setLength,
and an External: SIGSEGV At Address 403CDC when trying to step over setLength

Then if I change the order
TestDerived; // first
TestSimple;  // second

and step through, the A.List in Test Derived is A.List = () from the start, it is as-if it was preinitialized?

But then. If I comment out the other_field, both routines pass through with A.List = (0x0) in TestSimple before SetLength,
it also seems to pass without a problem and without the * problem below, even with A.List = () before and after SetLength.

* problem : with the other_field still IN TDerivedArrayString, 
if I step through the (passing with no error) TestSimple, and hover mouse over A, I get a GDB crash.
Regardless which A I hover over (the one in Test Derived does that too, even if out of scope 
[execution point currently in the other Test procedure]
Again this does NOT happen with the other_field commented out.

If I run either one Test* procedures at a time between rebuilds, with other_field defined,
TestSimple passes with no error,
TestDerived shows .List hovering A.List = (0x10000 '=') ; hovering over A crashes GDB too;

Say if I only leave TestDerived call, and if I pause execution before SetLength, 
hovering over .List in EITHER procedure shows A.List = () (yes even in TestSimple which is commented out in main begin..end;)
(and I get GDB crash when hovering over A of either procedure)

BUT.

If I truly comment out the unused procedure, only leaving the one currently being tested, like TestDerived,
hovering over .List before SetLength call gives A.List = (0x10000 '=')
hovering over A crashes GDB

after rebuild, program completes with NO SIGSEGV.

?

FPC 2.6.4 under Lazarus 1.4.4 from tarball release [ 2015-10-03, svn 49931 i386-win32-win32/win64 ] under WinXP SP3.




More information about the fpc-pascal mailing list