On Tue, 30 Mar 2010, Jim wrote:
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.
After allocating an object which you will free in the same routine, you should ALWAYS put a try..finally statement, and free the object in the
finally clause: Search := TFileSearch.Create; try // your code finally Search.free; end; After that, the error still happens, but at least there is no memory leak. The error is the following: FreeAndNil(Item); //Don't really now if we should do this but it can't hurt. Can it? It CAN hurt: TSearchRec is a record, you don't need to free it. Michael.
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
_______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/mailman/listinfo/fpc-pascal