2016-11-28 5 views
1

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 
+0

Powerbuilder-Version? –

+0

Warum haben Sie das Konstrukt 'if IsNull (ls_line) dann ls_line = ls_line ...'. Ändert es etwas? Ich könnte 'ls_line =" "' verstehen –

Antwort

0

Ich weiß nicht, was Ihre Version von Powerbuilder ist, sondern versuchen, die IsNull ersetzen()

CR # 304251 PB Enterprise Language - Runtime 8.0.3 UpperBound auf einem beliebigen Blob , das kein Array ist, und IsNull-Funktionen auf einem großen Blob sind Speicher undicht. Die Funktionen sind undicht, wenn sie an Variablen ausgeführt werden. Dies ist ein Fehler, der jedoch in einem 8.0.3-Patch nicht behoben werden kann. Problemumgehung ist auch Verwenden Sie tatsächliche Datentypvariablen.

CR # 279144 PB Enterprise DW - Laufzeit 8.0.1 IsNull der Punktnotation in Datenfenster Spaltendaten sind undichte Speicher.

CR # 217105 PB Enterprise-Window - Runtime 7.0.2 Speichernutzung steigt, wenn eine App ist in der Entwicklung oder die Laufzeit (p-Code und Maschinencode) ausgeführt wird, wenn isnull mit beliebigem Datentyp verwendet wird.

[...]

Es fügt auch die folgenden:

Yield() 
GarbageCollect() 
Verwandte Themen