[fpc-pascal] Newbie problems with memory leak and access violation/AV

Jim hakkie42 at gmail.com
Tue Mar 30 09:12:19 CEST 2010


Hi all,

Background: Hobby programmer; Microsoft Access VBA/Visual Basic 6/Visual
Basic.Net background.
I'm a FreePascal newbie but have fiddled with it some time ago. Was
looking into learning C++ but that seems too curly, so started again.
I've decided to write a file scanner program that indexes files and can
function as a Unix locate or CD indexer program replacement.

System: Windows Vista x64, (Lazarus and) Free Pascal Compiler version
2.4.1 [2010/03/13] for x86_64.
Had FPC 2.4 on Ubuntu 9.10 x32 as well, but got rid of it as my disk
space ran low. Have an OS X machine with Lazarus/FPC (don't remember
which version.

Problem: Probably due to my innocence, I seem to leak memory all over
the place as attested by fpc -gl -gh.
Also, after fiddling with swallowing exceptions and then deciding to
allow them to see what code is broken and fix the code, I get an AV.
To try and pinpoint the problem, I've slimmed down the program into a
simple program which you can find at:
http://bitbucket.org/jb/flocate/issue/1/access-violation-and-memory-leaks
I've included the heaptrc trace as well as my debug output in the comments.

What I'm trying to do: I'm adding details for each file I've found into
a new record. I then try to add a pointer to this record to an entry in
a TFPList. The code seems to bomb on the Res.Add line:
Procedure TFileSearch.AddFileToResult(ThisDir: Ansistring; item:
TSearchRec);
var
   APResultRecord : PResultRecord; // We use this pointer to store our
result.
begin
   //{$IFDEF DEBUG}(stderr, 'Debug: ', DateTimeToStr(Now), ': File
',ThisDir,Item.Name,' is a symlink: ', (Item.Attr And
faSymlink)=faSymLink);{$ENDIF}
   New(APResultRecord); //Create and assign memory to a new
TResultRecord record and store its pointer:
   APResultRecord^.Directory:=ThisDir;
   APResultRecord^.FileName:=Item.Name;
   APResultRecord^.ModifyTime:=FileDateToDateTime(Item.Time);
   APResultRecord^.Size:=Item.Size;
   {$IFDEF CRAZYDEBUG}writeln(stderr, 'Debug: ', DateTimeToStr(Now), ':
going to get hash for:', ThisDir, Item.Name);{$ENDIF}
   APResultRecord^.MD5Hash:=GetMD5Hash(ThisDir + Item.Name);
   {$IFDEF DEBUG}writeln(stderr, 'Debug: ', DateTimeToStr(Now), ': going
to add data to list for:', ThisDir, Item.Name);{$ENDIF}
   try
   Res.Add(APResultRecord); //add the pointer to the TFPList
   except
   {$IFDEF DEBUG}
   //doesn't seem to get called either.... just get av!!
   writeln(stderr, 'Debug: ', DateTimeToStr(Now), ': Adding point to
list went wrong. Info: ', ThisDir, Item.Name);
   writeln(stderr, 'Debug: ', DateTimeToStr(Now), ': ',
APResultRecord^.Directory);
   writeln(stderr, 'Debug: ', DateTimeToStr(Now), ': ',
APResultRecord^.FileName);
   writeln(stderr, 'Debug: ', DateTimeToStr(Now), ': ',
APResultRecord^.ModifyTime);
   writeln(stderr, 'Debug: ', DateTimeToStr(Now), ': ',
APResultRecord^.Size);
   writeln(stderr, 'Debug: ', DateTimeToStr(Now), ': ',
APResultRecord^.MD5Hash);
   {$ENDIF}
   end;
 end;

Could somebody tell me:
1. what I've done wrong regarding the AV
2. how I can fix the memory leaks
I probably don't grasp some basics on memory management...

Of course, suggestions for improvement are also welcomed; if you want
to, you can have a look at the rest of the program or get the latest
version on:
http://bitbucket.org/jb/flocate/get/tip.zip

If you need more detail, I'd be happy to (try and ;)  give it...

Thanks,
jb



More information about the fpc-pascal mailing list