In Anwendung habe ich eine Aufgabe, die Speicher verbraucht, bis es abstürzt. Mit dem processExplorer habe ich festgestellt, dass die folgende Funktion bei jedem Aufruf ca. 50MB zuweist (es wird 30 mal aufgerufen). Dieser Speicher wird nicht freigegeben, wenn die Funktion beendet wird, selbst wenn ich GarbageCollect aufruft. Beachten Sie, dass Funktionen genannt wie:Powerbuilder Speicher nicht freigegeben
Of_IsOrario, Of_GetCell, Of_GetRowCount, Of_GetColCOunt
nur Werte zurück (nicht Zuweisung Speicher)
long ll_file, i, j, ll_bytes, ll_fileWithTitles
double ld_value
string ls_line
n_cst_string str
ll_fileWithTitles = FileOpen(as_fileName + "text.txt", LineMode!, Write!, Shared!, Replace!, EncodingAnsi!)
ll_file = FileOpen(as_fileName, LineMode!, Write!, Shared!, Replace!, EncodingAnsi!)
if ll_file < 0 then
MessageBox("Σφάλμα", "Could not create file " + as_fileName)
return false
end if
for i = 1 to Of_GetColCount()
if in_tasks[i].Of_IsOrario() then
ls_line += "~tO" + in_Tasks[i].is_symbol
else
ls_line += "~t" + in_Tasks[i].is_symbol
end if
next
FileWrite(ll_fileWithTitles, ls_line)
for i = 1 to Of_GetRowCount()
ls_line = ""
for j = 1 to Of_GetColCount()
ld_value = -Of_GetCell(i, j)
if ls_line <> "" then ls_line += "~t"
ls_line += string(ld_value)
next
ls_line = str.Of_GlobalReplace(ls_line, ",", ".")
if IsNull(ls_line) then
ls_line = ls_line
end if
ll_bytes = FileWrite(ll_file, ls_line)
ls_line = string(in_matrix[i].il_agentId) + "~t" + ls_line
ll_bytes = FileWrite(ll_fileWithTitles, ls_line)
next
FileClose(ll_file)
FileClose(ll_fileWithTitles)
return true
Powerbuilder-Version? –
Warum haben Sie das Konstrukt 'if IsNull (ls_line) dann ls_line = ls_line ...'. Ändert es etwas? Ich könnte 'ls_line =" "' verstehen –