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 _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal