Frage zurm Persistenz von Objekten
-
Hallo,
völlige Noob-Frage: ich möchte in meinem Programm einen vector von Pointern auf eine Objekte einer Klasse erzeugen also sowas:
vector <*MyClass> listOfPointersToObjects;
Wieviele solche Objekte ich haben werde ändert sich während der Laufzeit des Programms (es werden also -zu Beginn unvorhersebar- manchmal neue Objekte hinten angehängt, bzw. manchmal welche herausgelöscht)
In meiner ListenKlasse sieht das etwa so aus:
class MyObjectPointerList { // blablabla...Konstruktor,Destruktor public: vector<MyClass*> listOfPointersToObjects; private void AddAObjectPointerToList (int arg1, int arg2); }; void MyObjectPointerList::AddObjectPointerToList(int arg1, int arg2) { // neuen Pointer auf ein Objekt vom Typ MyClass erstellen MyClass* myObject; // myClassObjekt mit eigenem Konstruktor instanziieren und initialisieren myObject = new myObject(arg1, arg2); listOfPointersToObjects.push_back(myObject); }(Code einfach nur so reingetippt...wahrscheinlich voller Fehler..aber ich hoffe es wird klar was ich meine)
Frage: Wenn die Methode AddObjectPointerToList() verlassen wird, wird dann nicht automatisch der Speicher für myObject freigegeben (out of scope?)? Wie gehe ich sicher, dass meine MyClass Objekte weiterhin bestehen bleiben und nicht irgendwann überschrieben werden? Wie kann ich dann weiterhin sicher gehen, dass ein spezifisches Objekt nur gelöscht wird wenn ich es explizit will?
Vielen Dank schonmal für eure Mühe!
-
Der Speicher für die Variable vom Typ "Pointer auf MyClass" wird freigegeben (vom Stack gepoppt), allerdings brauchst du den Zeiger ja nicht mehr. Du hast ja jetzt einen Zeiger auf den Heap-Speicher im Vektor.
Der mit new angeforderte Heap-Speicher wird erst wieder freigegeben wenn du dies explizit mit delete anordnest.
Du musst also eher aufpassen, dass du keine Elemente aus dem Vektor löscht, bzw. der Destruktor des Vektors aufgerufen wird -> dann hast du nämlich plötzlich gar keinen Zeiger mehr auf den Heap-Speicher, kannst also kein delete aufrufen und erzeugst ein Speicherleck!
Bevor du also Elemente aus dem Vektor kickst:
delete *iter; iter.remove();MfG SideWinder
-
Danke...dann hab ich ja in meinem Programm (unabsichtlich) alles richtig gemacht

-
antialias schrieb:
Danke...dann hab ich ja in meinem Programm (unabsichtlich) alles richtig gemacht

Check zur Sicherheit nochmal ob du im Destruktor von MyObjectPointerList auch jedes Element von listOfPointersToObjects mit delete löscht

MfG SideWinder