Gottfried Helms
2015-06-22 14:48:56 UTC
Hi -
gerade versuche ich in meinem Matrix-Programm Funktionen
zu bauen, die einen Satz verschiedner Matrizen (z.B. drei
Matrizen mit Real-Datentyp, 2 mit Stringdatentyp) ausgeben
können.
Nachdem das alles mit dynamischen Arrays selbst gut läuft,
hatte ich sogar als Rückgabewert einer Funktion einen
(dynamischen) Array von (dynamischen) Real-matrizen imple-
mentiert. Alles läuft gut.
Jetzt möchte ich als Funktionsrückgabe mehr Flexibilität
und eben wie oben genannt, gemischt Real-/String- evtl
Boolean- etc Matrizen verwalten können, und dachte ich
kann das vielleicht mit TList implementieren.
Zunächst schien das auch zu laufen, aber ein Speicher-test
(via taskmgr) ergab, daß zwischen
function meinemathematischefunktion(a.b): tmylist;
begin
setlength(myrealmatrix,a,a);
setlength(mystringmatrix,b,b);
result := tmylist.create;
with result do begin
mylist.add(myrealmatrix) ;
mylist.add(mystringmatrix) ;
... etc ...
end;
end; // ende der Funktion
und
for k:=1 to 50 do begin
resultlist:=meinemathematischefunktion(20*k,30*k);
dosomething(resultlist.items[0]);
dosomethingelse(resultlist.items[1]);
...
resultlist.deleteall ;
resultlist.destroy ;
die erzeugten Matrizen nicht alle gelöscht/freigegeben
werden obwohl ich in deleteall genau darauf geachtet
habe was ich da mache.
Wenn *überhaupt* keine Speicherfreigabe passieren würde,
wüßte ich ja, daß ich irgendwas grundsätzlich falsch
mache - das ist also offensichtlich nicht ganz der Fall.
Aber das gerade *die Hälfte* des nach -z.b. in einer
Testroutine - 50 fachen add von 200x200 Matrizen
allokierten Speichers freigeben wird wenn ich deleteall
und destroy mache, ist irgendwie komisch.
Gibt's jemand der mit diesem Problem Erfahrung hat?
Ich vermute mal, daß irgendwo ein kleiner Wurm in meinem
Verständnis steckt, und ich das Problem lösen kann, wenn
ich den notwendigen Trick sehe.
Vielleicht hat jemand sowas gerade parat, wie man
so eine Klasse tmylist implementieren müßte?
ALso es scheint ja wohl zu sein daß an irgendeiner
Stelle statt einer zwei Matrizen erzeugt werden, wobei
dabei aber eine der beiden Adressen verlorengeht und
deshalb beim deleteall nicht angesprochen werden kann?
(jedenfalls meine aktuelle Hypothese...)
Gottfried
gerade versuche ich in meinem Matrix-Programm Funktionen
zu bauen, die einen Satz verschiedner Matrizen (z.B. drei
Matrizen mit Real-Datentyp, 2 mit Stringdatentyp) ausgeben
können.
Nachdem das alles mit dynamischen Arrays selbst gut läuft,
hatte ich sogar als Rückgabewert einer Funktion einen
(dynamischen) Array von (dynamischen) Real-matrizen imple-
mentiert. Alles läuft gut.
Jetzt möchte ich als Funktionsrückgabe mehr Flexibilität
und eben wie oben genannt, gemischt Real-/String- evtl
Boolean- etc Matrizen verwalten können, und dachte ich
kann das vielleicht mit TList implementieren.
Zunächst schien das auch zu laufen, aber ein Speicher-test
(via taskmgr) ergab, daß zwischen
function meinemathematischefunktion(a.b): tmylist;
begin
setlength(myrealmatrix,a,a);
setlength(mystringmatrix,b,b);
result := tmylist.create;
with result do begin
mylist.add(myrealmatrix) ;
mylist.add(mystringmatrix) ;
... etc ...
end;
end; // ende der Funktion
und
for k:=1 to 50 do begin
resultlist:=meinemathematischefunktion(20*k,30*k);
dosomething(resultlist.items[0]);
dosomethingelse(resultlist.items[1]);
...
resultlist.deleteall ;
resultlist.destroy ;
die erzeugten Matrizen nicht alle gelöscht/freigegeben
werden obwohl ich in deleteall genau darauf geachtet
habe was ich da mache.
Wenn *überhaupt* keine Speicherfreigabe passieren würde,
wüßte ich ja, daß ich irgendwas grundsätzlich falsch
mache - das ist also offensichtlich nicht ganz der Fall.
Aber das gerade *die Hälfte* des nach -z.b. in einer
Testroutine - 50 fachen add von 200x200 Matrizen
allokierten Speichers freigeben wird wenn ich deleteall
und destroy mache, ist irgendwie komisch.
Gibt's jemand der mit diesem Problem Erfahrung hat?
Ich vermute mal, daß irgendwo ein kleiner Wurm in meinem
Verständnis steckt, und ich das Problem lösen kann, wenn
ich den notwendigen Trick sehe.
Vielleicht hat jemand sowas gerade parat, wie man
so eine Klasse tmylist implementieren müßte?
ALso es scheint ja wohl zu sein daß an irgendeiner
Stelle statt einer zwei Matrizen erzeugt werden, wobei
dabei aber eine der beiden Adressen verlorengeht und
deshalb beim deleteall nicht angesprochen werden kann?
(jedenfalls meine aktuelle Hypothese...)
Gottfried