Das hat den gleichen Effekt wie setlength(meinArray,0,0);
Ich habe auch noch festgestellt, dass die Häfigkeit, wie oft meine For-Schleifen mit dem setlength() durchlaufen werden keine Auswirkung auf den Speicherzuwachs hat.
Ich habe deshalb einfach mal die Hälfte meiner Datensätze, die ich in die Software einlese und dann nicht weiter benötige von meinem
SQL-Server geschmissen.
Ich wollte damit testen, ob der Speicher bei meiner Procedure oder schon beim Einlesen der Daten, aus dem
MySQL Server heraus, geblockt wird.
Obwohl das Ergebnis meiner Suchprocedure das gleiche ist, also die setlength() Befehle genauso oft aufgerufen werden wie vorher, ist das Speicherleck auf 150kbyte runter.
Das führt mich wieder zu meiner Annahme, dass ich aus irgendeinem Grund meine Arrays nicht geleert bekomme.
Diese Annahme wird weiter gestützt durch die Tatsache, dass ich auch bei anderen Proceduren Speicherlecks habe, wo Daten quasi nur von dem
MySQL Server geholt und ausgegeben werden...
Nachfolgend die Funktion, die ich für den Datentransfer nutze...
Delphi-Quellcode:
function ExecQuery(
const Datenbank,
query:
string;
var Cols: TCols;
var Rows: TRows): Boolean;
var
i: Integer;
j: Integer;
Startzeit1, Startzeit2, Endzeit1, Endzeit2 : cardinal;
begin
// Datenbank auswählen
ErrorCode := mysql_select_db(_mycon, PChar(Datenbank));
if ErrorCode = 0
then
begin
// Query ausführen
ErrorCode := mysql_real_query(_mycon, PChar(
query), length(
query));
if ErrorCode <> 0
then
begin
ShowMessage(mysql_error(_myCon));
Exit;
end
else
begin
// Query speichern
MySQLRes := mysql_store_result(_mycon);
if Assigned(MySQLRes)
then
begin
// zurückgelieferte Anzahl der Spalten
ColCount := mysql_num_fields(MySQLRes);
SetLength(Cols, ColCount);
// Spalten-Array füllen
for i := 0
to ColCount - 1
do
begin
Field := mysql_fetch_field_direct(MySQLRes, i);
Cols[i] := Field.
Name;
end;
// Anzahl der betroffenen Zeilen ermitteln
AffectedRows := mysql_affected_rows(_mycon);
SetLength(Rows, ColCount, AffectedRows);
// neu ->
// Zeilen-array füllen
// alle Zeilen ...
for j := 0
to AffectedRows - 1
do
begin
// ... werden eingelesen
MySQLRow := mysql_fetch_row(MySQLRes);
// alle Spalten ...
for i := 0
to ColCount - 1
do
begin
// ... werden in Rows[] übertragen
Rows[i, j] := MySQLRow[i];
end;
end;
// gespeicherte Abfrage wieder freigeben
{mysql_free_result(MySQLRes);}
end
end
end;
result := ErrorCode = 0;
end;
Könnt Ihr mir hlefen?
Danke
Patrick