Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - tdictionary verliert werte?
badstuberl - Do 07.04.11 12:18
Titel: tdictionary verliert werte?
hi beisammen. ich fülle aus einer textdatei mit key-value-paaren. ein dictionary<string, tstringlist>.
das füllen wird in einer prozedur erledigt. das dictionary ist eine globale variable. wenn ich über die values innerhalb der füll-prozedur iteriere, dann sehe ich meine values:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| for ValueName in dict.Values do begin for i := 0 to Valuename.Count - 1 do write('Values are : '+ Valuename[i]); writeln; end; |
wenn ich dies jedoch nach "begin" mache (also im main-teil), sind meine values futsch. was mache ich da falsch?
der code in main sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| begin dict := TDictionary<String, TStringlist>.Create; parsefileandfilldict; for ValueName in dict.Values do begin for i := 0 to Valuename.Count - 1 do write('Values are : '+ Valuename[i]); writeln; end; . . . end. |
Moderiert von
Martok: Code- durch Delphi-Tags ersetzt
jaenicke - Do 07.04.11 12:43
Hallo und :welcome:
Das sieht so korrekt aus. Ich glaube ich ahne aber was du machst:
Wahrscheinlich gibst du einfach die Stringlisten wieder frei, die du in das Dictionary packst...
Ansonsten wäre es sinnvoller ein komplettes kleines Demoprogramm zu posten.
badstuberl - Do 07.04.11 13:26
ja die gebe ich wieder frei :) also die stringlisten sind lokal in der füllprozedur. länger müssen sie ja nicht existieren, oder? die werden am ende der prozedur natürlich wieder ge-freet. oder ist das falsch?
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| if AnsiStartsStr('name', splitarray[0]) then begin split(' ', splitarray[0], subsplit1); splitarray[0]:=subsplit1[1]; split(',', splitarray[1], subsplit2); dict.Add(splitarray[0], subsplit2);
... splitarray.Free; subsplit1.Free; subsplit2.Free; end; |
splitarray und subsplit[1,2] sind lokale stringlisten, die am ende der prozedur wieder geleert werden. dort kann ich mir die values auch anzeigen lassen. gehen denn die werte in dem dictionary nachher wieder flöten? die keys existieren ja noch... ich dachte, ich fülle das dict (egal wo, da global) und kann dann immer darauf zugreifen.
jaenicke - Do 07.04.11 14:34
badstuberl hat folgendes geschrieben : |
| ja die gebe ich wieder frei :) also die stringlisten sind lokal in der füllprozedur. länger müssen sie ja nicht existieren, oder? |
Wenn du danach die Werte nicht mehr brauchst, müssen sie danach nicht mehr existieren. Hier greifst du danach aber über das Dictionary auf die TStringList-Objekte zu, also brauchst du die ja noch...
Heißt: Die darfst du erst freigeben, wenn du den entsprechenden Wert im Dictionary entfernst bzw. dieses freigibst.
badstuberl - Do 07.04.11 15:12
ah, danke! dann werd ich den speicher später freigeben!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!