gcnew Regex() erzeugt memory leak.
-
Hallo, folgende Zeile erzeugt bei mir ein memory leak:
System::Text::RegularExpressions::Regex^ regex = gcnew System::Text::RegularExpressions::Regex(cardregex);
Habe alles andere in der Funktion auskommentiert und rufe die Funktion ständig auf.
Der Speicherverbrauch steigt dann glaube ich immer in 4KB schritten an.
Ich dachte bei gcnew muss man den Speicher nicht selber freigeben.
Muss man das doch irgendwie?veio
-
veio schrieb:
Hallo, folgende Zeile erzeugt bei mir ein memory leak:
Ich dachte bei gcnew muss man den Speicher nicht selber freigeben.
veioDie Freigabe erfolgt nur automatisch, wenn keine Referenzen auf dieses Objekt existieren. Gibt es da noch welche?
-
ne, ich mach mit der Variable nix(alles auskommentiert).
cardRegex ist ein String^ und wird in der Zeile wie folgt deklariert:String^ cardregex = "(?<value>[2-9TJQKA]{1})(?<color>[dhcs]{1})";
-
Und wenn Du delete regex ausführst, ist das Leak weg?
-
bringt nichts, stürzt aber auch net ab^^
Speicherverbrauch steigt genauso weiter an.
-
Der GC gibt Objekte frei wann er Lustig ist bzw. wenn er Zeit dazu findet. Selbst wenn der Referenzzähler bei 0 angelangt ist, heißt das noch nicht, das dieses Objekt auch aufgeräumt und entsorgt wird.
Ein Memoryleak ist es zudem erst dann, wenn der gesamte Prozess beendet ist und der Speicher nicht freigegeben wurde. Die Aussage, das der Speicher in 4k schritten ansteigt ist hier kein Indiz für ein Leak.
In den C++ Artikeln findest Du ein paar Diskussionen um das Thema GC, u.a. eine umfangreichere Diskussion um den GC des .Net Frameworks (inkl. einem GC.Collect zum erzwingen des Aufräumens.)
-
Wie lang hast du dann das beobachtet? Der GC räumt ja nicht sofort auf wenn keine Referenzen mehr vorhanden sind, sondern erst bei Bedarf. Wenn du massig Speicher hast, dann wird der Speicherverbauch erst noch munter weitersteigen bis der GC irgendwann eingreift. (Aber sollte von einem anderen Programm sehr viel Speicher angefordert werden, dann gibt auch der GC sofort Speicher in deinem Programm frei.
-
Also wenn ich das in einer Endlosschleife aufrufe, läuft er sauber ohne zu pumpen.
while (true) { String^ cardregex = "(?<value>[2-9TJQKA]{1})(?<color>[dhcs]{1})"; System::Text::RegularExpressions::Regex^ regex = gcnew System::Text::RegularExpressions::Regex(cardregex); }
-
Talla schrieb:
Der GC räumt ja nicht sofort auf wenn keine Referenzen mehr vorhanden sind, sondern erst bei Bedarf.
Du könntest mal GC::Collect() aufrufen um das auszuschließen.
-
witte schrieb:
Also wenn ich das in einer Endlosschleife aufrufe, läuft er sauber ohne zu pumpen.
while (true) { String^ cardregex = "(?<value>[2-9TJQKA]{1})(?<color>[dhcs]{1})"; System::Text::RegularExpressions::Regex^ regex = gcnew System::Text::RegularExpressions::Regex(cardregex); }
Es scheint eine Obergenze zu geben. Ich hatte da noch ein Sleep(300); eingebaut um besser sehen zu können um wieviel es pro aufruft ansteigt.
Ohne Sleep bleibt er bei mir auch bei einem Speicherbedarf stehen, den ich vorher nicht erreicht hatte.Dann werde ich das wohl so lassen können, danke für die Hilfe.