I'm a bit puzzled of what to use for storing objects in a list.
Until now I have used TList
and freed each item in a loop. Then I discovered TObjectList
that do this automatically from Free
. Then I saw this from the doc of TList.Clear
:
Call
Clear
to empty the Items array and set theCount
to 0.Clear
also frees the memory used to store theItems
array and sets theCapacity
to 0.
So it is basically the same. So
for TList
mylist.Clear;
myList.Free;
is the same as for TObjectList
?
myList.Free;
Can TObjectList
only be used for items as classes or can I store records?
If you are using a recent version of Delphi I suggest that you use a generic list.
Right now you probably need to do a lot of casting when you use the objects from the list. With a generic list you don't have to do that anymore.
For instance if you have:
Then you make the list like this:
There is an article in the Embarcadero Wiki:
http://docwiki.embarcadero.com/CodeExamples/XE8/en/Generics_Collections_TObjectList_(Delphi)
Read what the documentation is saying more carefully:
Only the memory for the array itself is freed, not the memory used by individual elements inside the array.
It's not the same
TList.Clear
only frees the memory allocated to store the pointers, not objects they are pointing to. To avoid memory leaks you need to free the memory yourself - as you have been doing - or useTObjectList
.To answer the second question,
TObjectList
doesn't support storing records. You need to useTList
(or something else) in that case.Really watching the
TObjectList
code in contnrs.pasOwnObjects
does nothing.FOwnObjects
is a variable declared in the private part ofTObjectList
that is not used anywhere in theTObjectList
code (except just assigning the value), and there is no overriddenClear
procedure in it.So I'm afraid it necessary to free the memory just the same as in
TList
.1. TList won't free the elements, with both
Clear
orFree
.aList.Clear;
Will just set
aList.Count := 0
without freeing theaList.Items[]
elements. So you'll leak memory. You'll need an explicit free as such:But this is what
TObjectList
does... :)About
TObjectList
, it is worth saying thatTObjectList.Destroy
is callingClear
.So
is exactly the same as
2. To store a list of records, you can use a dynamic array.
You'll get all
TList
methods (and more) with our dynamic array wrapper. That is,Add / Delete / Clear / Count / IndexOf / Find
...It has built-in serialization features (in binary or JSON), automated sorting and comparison (using RTTI) which are not existing with a
TList/TObjectList
. From Delphi 5 and later.With more modern version of Delphi, you may use generics to handle the dynamic array, if you do not want to use a third-party library.