Solved

Memory leak that is driving me nuts...

Posted on 2014-02-12
7
391 Views
Last Modified: 2014-02-13
Hi Experts, I have my app fitted with FastMM4 to show me the memory leaks... and I've got one that's really stumping me. Basically I enter a procedure where I declare one local instance of a variable of type TCSVBasicRecord. Let's call this instance "NewItem". TCSVBasicRecord is previously declared globally in my app as such:

type TCSVBasicRecord = class(TObject)
  public
    Fields: TStringList; // de-quoted
    OriginalTexts: TStringList; // including quotes/double quotes
    Constructor Create;
    Destructor Destroy; override;

    Class Function CreateFromFileText(var AllText: string; delimiter_: char; quoteChar_: char; endOfRecordIndicator: string): TCSVBasicRecord;
end;

Open in new window


(the Function CreateFromFileText does a bunch of string manipulations and basically parses a string according to CSV convention... that's not the problem)

OK, in my procedure I've got a TRY...EXCEPT block within a While loop that does the bulk of the work. When data is clean and everything works good and no exceptions are thrown, everything gets freed and tidied up nicely and no memory leaks are reported when I exit my app. But when I run a test with erroneous data that triggers an exception and enters the EXCEPT block, I get a stupid memory leak. In my EXCEPT block, I show an error message and then terminate the app, but just before doing so, I make sure to perform the exact same free-ing of objects and closing of files that I do when the app runs successfully. So I'm just baffled by this... any thought anyone please?

Thanks
    Shawn
0
Comment
Question by:shawn857
7 Comments
 

Author Comment

by:shawn857
ID: 39855176
Oh, by the way - here is the FastMM4 memory leak report that gets output:

This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):



5 - 12 bytes: TCSVBasicRecord x 17, AnsiString x 40

13 - 20 bytes: TObjectList x 1, TList x 2

37 - 44 bytes: TSystemInfo x 1

45 - 52 bytes: TStringList x 34

53 - 60 bytes: AnsiString x 238

101 - 108 bytes: Unknown x 34

173 - 188 bytes: Unknown x 1


Note: To obtain a log file containing detail on memory leaks, enable the "FullDebugMode" and "LogMemoryLeakDetailToFile" conditional defines. To disable this memory leak check, undefine "EnableMemoryLeakReporting".
----------

That "TCSVBasicRecord x 17" is the culprit - all the other leaks reported are due to that one. I don't know how it would tally up 17 occurrences of TCSVBasicRecord leaking - I only declared one instance of it ("newItem") in my procedure... and I made sure I planted my erroneous data in the very first record the WHILE loop read. It's really got me scratching my head, for sure.

Thanks!
    Shawn
0
 
LVL 100

Expert Comment

by:mlmcc
ID: 39855202
I probably can't help with this but I know the experts who can will need to see the problem code to ensure you are freeing everything correctly.

mlmcc
0
 
LVL 31

Assisted Solution

by:Marco Gasi
Marco Gasi earned 167 total points
ID: 39855372
Yes, you should post here the code of the function CreateFromFileText();
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 19

Accepted Solution

by:
MerijnB earned 167 total points
ID: 39855530
Do you still have the leak when you don't terminate the app, but close it 'normally'?
0
 
LVL 37

Assisted Solution

by:Geert Gruwez
Geert Gruwez earned 166 total points
ID: 39855613
are you sure you a class function for this ?
and not an ordinary method ?

the biggest possibility for your memory leak with class function is
that every you call this class function, it creates an instance of the object and doesn't free it
same like calling the constructor and not destroying the variable

are you creating an instance TCSVBasicRecord upon every call to the class function
or are you reading from an existing instance ?
0
 

Author Comment

by:shawn857
ID: 39857629
Merjin - no leak when I close my app normally - only when I purposely enter my exception code and I terminate it.
   I'm going to make a stripped-down version of my app and attempt to replicate the error so it will be more clear that way. Then I'll post the full code. I'll be back in a bit!

Thanks
   Shawn
0
 

Author Comment

by:shawn857
ID: 39857783
Well, as I was stripping it down, I found the problem boys - some other objects that I was failing to clean up during the terminate, that I would normally clean up during the normal program exit. Duhhh, sorry guys! I'm going to split the points amongst the 3 of you - Marco, Merjin and Geert. Thanks and sorry for the bother!

Shawn
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Windows Drag & Drop Location 2 94
Intraweb download file link ? 1 108
how can i search if string exist in array ? 3 49
Delphi and Access based Enumeration 9 46
Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
In my programming career I have only very rarely run into situations where operator overloading would be of any use in my work.  Normally those situations involved math with either overly large numbers (hundreds of thousands of digits or accuracy re…
This Micro Tutorial will give you a basic overview how to record your screen with Microsoft Expression Encoder. This program is still free and open for the public to download. This will be demonstrated using Microsoft Expression Encoder 4.
This Micro Tutorial demonstrates using Microsoft Excel pivot tables, how to reverse engineer competitors' marketing strategies through backlinks.

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now