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 user profile iconMartok: 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

user profile iconbadstuberl hat folgendes geschrieben Zum zitierten Posting springen:
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!