Probleme mit Speicherung von struct in Containerklasse
-
Hi,
ich programmiere derzeit an einem Programm in dem ich zur Laufzeit ständig strings speichern und abrufen muss/möchte. Ich wollte dies mit einer globalen Containerklasse wie z.b. std:list<> lösen. Dazu hab ich in der main.cpp erstmal mein struct definiert, welches ich speichern möchte und eine liste ebenjener structs definiert. Und jetzt möchte ich in blubb.cpp das struct zur Laufzeit füllen und an die liste dauerhaft anhängen. Soweit so gut, funktioniert erstmal soweit. Mein Problem ist nun sobald ich in blubb.cpp mein listingstruct ändere und an die liste anhänge, ändern sich alle bereits vorhandenen Einträge zu ebenjenen Eintrag. D.h. sämtliche bisherigen Einträge in der Liste sind identisch zum letzten Eintrag. Gebe ich den Speicher zu listingstruct wieder frei, werden die Einträge in der Liste auch gelöscht. Ist natürlich klar, weil überall der Zeiger auf denselben Speicherbereich drinne steht. Mein Frage ist nun, wie kann ich das evtl. (anders) lösen, das alle Elemente so bleiben wie sie sind? Ich habe vermutlich das Grundprinzip noch nicht verstanden und bitte etwas um Nachsicht, man lernt jeden Tag was Neues dazu.

main.cpp
#include <list> struct LISTING { std::string name; std::string listings; }; std::list<LISTING *> newlist; int main(int argc, char **args) { }blubb.cpp
#include <list> extern struct LISTING { std::string name; std::string listings; }; extern std::list<LISTING *> newlist; [...] int *Blubb::createParse(Lala::DIR *directory) { std::string Listing, Listing1; LISTING *listingstruct = new LISTING; if (newlist.empty()) { listingstruct->name = ""; listingstruct->listings = ""; newlist.push_back(listingstructstruct); } for (std::list<LISTING *>::iterator i = newlist.begin(); i != newlist.end(); i++) { listingstruct = *i; if ((listingstruct->name == directory->dir->path + directory->name) && (listingstruct->listings != "")) { Listing1 = listingstruct->listings; } else { Listing1 = loadFile(directory->dir->path + directory->name, Listing); listingstruct->name = directory->dir->path + directory->name; listingstruct->listings = Listing1; newlist.push_back(listingstruct); } } } //delete listingstruct; }
-
Du kannst auch eine 'list<LISTING>' anlegen (ohne den *), dann speichert die Liste bei jedem push-back eine Kopie deines struct's. (und um die Freigabe des Speichers kümmert sie sich dann auch selber)
-
CStoll schrieb:
Du kannst auch eine 'list<LISTING>' anlegen (ohne den *), dann speichert die Liste bei jedem push-back eine Kopie deines struct's. (und um die Freigabe des Speichers kümmert sie sich dann auch selber)
Danke, hat funktioniert!
Rein interessehalber, was müsste ich denn noch machen damit die "list<LISTING *>" Methode funktioniert?
-
Bei jedem Schleifendurchlauf neuen Speicher per new anfordern - und am Programmende die gesamte Liste durchlaufen und ihren Speicher wieder freigeben.