Vector und Speicherfreigabe
-
Hallo zusammen,
ich möchte einer Funktion mehrere StringListen übergeben und habe dazu mal eine Beispielfunktion erstellt, die soweit auch funktioniert, ich bin mir nun nur nich so sicher, ob der Speicher dannach auch richtig wieder freigeben wird.Folgendes habe ich geschrieben:
void __fastcall TForm1::Button1Click(TObject *Sender) { TStringList *sl = new TStringList(); TStringList *sl1 = new TStringList(); sl->Add("Test1232131"); sl->Add("Test1232131"); sl->Add("Test1232131"); sl1->Add("Bla"); sl1->Add("Bla"); sl1->Add("Bla"); std::vector<TStringList*>test; test.push_back(sl); test.push_back(sl1); AddDieLines(test); delete sl; delete sl1; test.clear(); } //--------------------------------------------------------------------------- void __fastcall TForm1::AddDieLines(std::vector<TStringList*> Input) { Memo1->Clear(); for(unsigned int i=0; i<Input.size(); i++) { for(int y=0; y<Input[i]->Count; y++) Memo1->Lines->Add(Input[i]->Strings[y]); } } //---------------------------------------------------------------------------
Reicht es nun aus einfach die einzelnen StringListen zu deleten und den vector zu clearen? Eigentlich ja, oder? Da ich ja dem vector nur die Speicheradressen hinzufüge.
Danke im vorraus.
mfg
-
Sollte ausreichend sein.
Noch besser wäre es, wenn du keine Zeiger aufTStringList
, sondern die Objekte selbst in den vector steckst. Dann brauchst du kein new und kein delete mehr.
-
VCL-Objekte (wie TStringList) können aber nur mittels new allokiert werden.
Jedoch finde ich zum einen die Vermischung von STL und VCL-Typen nicht so gelungen und zum zweiten gibt es eine viel einfachere Möglichkeit:
Memo1->Clear(); Memo1->Lines->AddStrings(sl); Memo1->Lines->AddStrings(sl1);
Oder entsprechend als Methode umschreiben.
Und für die lokalen VCL-Objekte könnte man auch std::auto_ptr verwenden (ich weiß, das ist jetzt auch eine Klasse aus der Standand C++ Library, aber keine Container-Klasse).
std::auto_ptr<TStringList>sl = std::auto_ptr<new TStringList()>; Memo1->Clear(); Memo1->Lines->AddStrings(sl.get()); Memo1->Lines->AddStrings(sl1.get());
Dann brauchst du dir keine Gedanken wegen dem 'delete' machen (egal wie die Funktion verlassen wird).
-
Wegen dieser dämlichen VCL Konvention, alle Objekte nur auf dem Heap zu erzeugen würde ich zB gar keine TStringList mehr verwenden. vector<AnsiString> ist von der Funktionalität vergleichbar und nimmt dir die Speicherverwaltung ab. Wenn du vector<vector<AnsiString> > ist das vergleichbar mit vector<TStringList*>, und ebenfalls ohne manuelle Speicherverwaltung.
-
Da aber die einzelnen Zeilen dann an die Memo-Komponente gehängt werden sollen, und dafür dann AddStrings am einfachsten ist, wäre das mit dem vector dann unnötig.
Die Frage wäre auch noch, woher die Einträge für die Listen in der Originalanwendung herkommen, d.h. ob selber aus VCL-Komponenten oder aber mit einer STL-Datenstruktur.
-
Th69 schrieb:
Da aber die einzelnen Zeilen dann an die Memo-Komponente gehängt werden sollen, und dafür dann AddStrings am einfachsten ist, wäre das mit dem vector dann unnötig.
Was mit for_each und dem entsprechendem Binder mit einer Zeile erschlagen werden kann.