TStringList-Array
-
Hallo Ich will ein Array aus TStringlists machen. Ich würde gerne die Größe des Arrays in einer for-Schleife bestimmen. Beim Erstellen des Arrays ist sozusagen noch nicht klar, wie groß es wird, sondern erst in der Schleife wird dies bestimmt.
Ich hab schon ein bisschen rumprobiert, aber irgendwie funzt dat nich.
Etwas vereinfacht sieht es so in der Art aus:k = 0; TStringList *MyList[]; for (int j = 0; j < count; j++) { if (true) { TStringList *MyList[k] = new TStringList; k++; } }
-
Nimm lieber einen std::vector. Das geht dann so
std::vector<TStringList*> MyList; for (int j = 0; j < count; j++) { if (true) { MyList.push_back(new TStringList); } }
Du darfst aber das Löschen den TStringList-Instanzen am Schluß nicht vergessen. Wie das mit dem vector funktioniert steht unter anderem im C++Magazin.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-143816.html
-
Also ehrlich gesagt, finde ich das Löschen in dem Thread nicht. Alles andere Nützliche, was ich brauche, habe ich erstmal gefunden ...
-
Gibts es keinen Befehl zum löschen des gesamten vectors auf einmal? Muss man das so doof über die einzelnen Elemente löschen machen?
-
MichelM schrieb:
Gibts es keinen Befehl zum löschen des gesamten vectors auf einmal? Muss man das so doof über die einzelnen Elemente löschen machen?
Nicht, wenn du geeignete Smart-Pointer (std::tr1::shared_ptr<>) anstelle von Zeigern im Vektor speicherst.
-
Man könnte sich auch fragen, warum überhaupt TStringList. Wenn man statt dessen auch einen vector verwendet braucht man gar nichts mehr zu löschen.
Also z.Bsp.std::vector<std::vector<AnsiString> >
Natürliche fehlen dann die Komfortfunktionen von TStringList, die man sich aber leicht selber schreiben kann.
Eine weiter Alternative zum Löschen ohne for-Schleife wäre die Verwendung von for_each.
-
Braunstein schrieb:
Natürliche fehlen dann die Komfortfunktionen von TStringList, die man sich aber leicht selber schreiben kann.
Sicher, wenn man zu viel Zeit hat
Braunstein schrieb:
Eine weiter Alternative zum Löschen ohne for-Schleife wäre die Verwendung von for_each.
Beides wäre nicht exceptionsicher.
-
audacia schrieb:
Sicher, wenn man zu viel Zeit hat
Man muß das ja nur einmal machen.
audacia schrieb:
Beides wäre nicht exceptionsicher.
Das ist richtig. So gesehen ist die Benutzung der VCL auch nicht exceptionsicher.
Hier werden schließlich auch überall rohe Zeiger rumgereicht.
-
Braunstein schrieb:
Eine weiter Alternative zum Löschen ohne for-Schleife wäre die Verwendung von for_each.
Beides wäre nicht exceptionsicher.[/quote]
Mit einem exception-safe Functor kein Problem.
-
Braunstein schrieb:
So gesehen ist die Benutzung der VCL auch nicht exceptionsicher.
Hier werden schließlich auch überall rohe Zeiger rumgereicht.Doch, die VCL ist exceptionsicher - wenn man sie richtig benutzt. Einen gewissen Teil der Speicherverwaltung übernimmt das Owner-Konzept, für anderes ist man selbst verantwortlich. Sauber programmierter Delphi-Code enthält deshalb auch nicht ganz selten try/finally; in C++Builder wären Smart-Pointer angemessener. (Und seit Delphi 2009 kann man mit Generic Records auch Smart-Pointer implementieren.)
@_DocShoe_: Daß man nicht auch ohne Smart-Pointer dynamischen Speicher exceptionsicher verwalten könnte, habe ich ja nicht behauptet. Es stellt sich nur die Frage, was leichter zu vermitteln und zu benutzen ist
Und ich bezweifle stark, daß der Threadersteller nach Braunsteins Hinweis einen exceptionsicheren Funktor implementiert und zudem noch einen try/__finally-Block oder ein Äquivalent um seine ganze Methode gelegt hätte, damit die Freigabe nach einer Exception überhaupt noch stattfindet.
-
audacia schrieb:
Doch, die VCL ist exceptionsicher - wenn man sie richtig benutzt.
Dieser Satz trifft letzendlich auf jedes Konstrukt zu. Man muß nur "VCL" durch den jeweiligen Namen austauschen.
Die Diskussion ist aber müßig. Die Lösung mit shared_ptr ist schon die Beste.