std::vector löschen
-
Doch, aber nur manuell (d.h.
deleteauf jedes Element anwenden). Und das birgt einige Risiken, z.B. im Hinblick auf vergessene Freigabe, Exceptionsicherheit, fehlende Wertsemantik und damit auch normale Operationen, die zum Problem werden (z.B. STL-Algorithmen oder Kopien/Zuweisungen von Containern).
-
Student83 schrieb:
D.h. ohne Smartpointer lässt sich ein solcher statischer Vector von rohen Pointern nicht löschen?
Doch, durch iterieren und einzeln Löschen (vorausgesetzt der vector hält den Besitz, wenn nicht wären aber auch die Smartpointerlösung oder die ptr-Container falsch).
Nur ziehen halt viele den leichten Weg vor, wo man sich nach Möglichkeit nicht selbst um die Freigabe kümmern muss (Jede Sache, um die man sich nicht selbst kümmern muss, kann man auch nicht irrtümlich vergessen).
-
Eine Lösung wäre es noch, diesen vector<> in einen Singleton zu verpacken, der bei seiner Vernichtung die vector<>-Elemente freigibt.
PS: Wazu brauchst du das überhaupt?
-
Gute Frage, ich könnte es wohl auch so
std::vector<ExampleClass> exampleVector;ohne Verwendung von Pointern implementieren. Aber ist es nicht deutlich schneller einen Vector von Pointern zu durchsuchen? Zumindest meine ich das so gelesen zu haben.
-
Nein, das Durchsuchen wird in einem normalen vector schneller sein, weil du nicht jeden Zeiger dereferenzieren mußt (wobei: die Unterschiede sind nur minimal). Größere Geschwindigkeits-Unterschiede könnten sich höchstens ergeben, wenn du den Vector-Inhalt regelmäßig änderst (einfügen, löschen etc im gesamten Bereich).
-
Und sofern das nicht die zeitkritische Stelle deines Programms ist (was du mit einem Profiler herausfinden kannst), entscheide dich für die naheliegende Lösung, also für
std::vector<ExampleClass>. Optimieren kannst du später immer noch.
-
Der Vector wird einmalig beim Anwendungsstart gefüllt und danach nicht mehr verändert. Ich habe mich übrigens getäuscht ich komme an dieser Stelle an Pointern nicht vorbei, da diese auf Membervariablen zeigen und ich ansonsten ja lediglich Kopien von diesen erstelle.
Übrigens habe ich eben wieder den Text gefunden wo gesagt wird dass man in den STL-Containern Pointer auf die Objekte anstatt die Objekten selber verwenden soll.
http://www.tantalon.com/pete/gdc2001roundtablereport.htmStore pointers to objects rather than the objects themselves
Zudem werden Smartpointer wie schon von euch empfohlen:
Store "smart" pointers (see Boost libraries)
-
Student83 schrieb:
Der Vector wird einmalig beim Anwendungsstart gefüllt und danach nicht mehr verändert. Ich habe mich übrigens getäuscht ich komme an dieser Stelle an Pointern nicht vorbei, da diese auf Membervariablen zeigen und ich ansonsten ja lediglich Kopien von diesen erstelle.
Dann willst Du ja auch gar nicht deleten.
Student83 schrieb:
Store pointers to objects rather than the objects themselves
Das ist so allgemein Quatsch.
Die Zusammenstellung riecht nach 1995, nicht nach 2009.Student83 schrieb:
Zudem werden Smartpointer wie schon von euch empfohlen:
Store "smart" pointers (see Boost libraries)
ptr_containers kannten die wohl nicht.
-
Dann willst Du ja auch gar nicht deleten.
Während das Programm läuft nicht. Das Stimmt. Aber muss ich den statischen Vector dann nicht spätestens beim Beenden freigeben?
Die Zusammenstellung riecht nach 1995, nicht nach 2009.
Ok, da kannst du recht haben.
ptr_containers kannten die wohl nicht.
Boost möchte ich eigentlich nicht verwenden. Wann wird dieser ptr_vector denn zum Standard?
-
Student83 schrieb:
Dann willst Du ja auch gar nicht deleten.
Während das Programm läuft nicht. Das Stimmt. Aber muss ich den statischen Vector dann nicht spätestens beim Beenden freigeben?
Aber zeigen deine Zeiger nicht alle auf Membervariablen fremder Objekte und die fremden Objekte löschen ihre Members schon?
-
wieso willst du eigentlich einen statischen vektor der zeiger auf alles mögliche speichert, unter anderem auch auf membervariablen(die eh gelöscht werden) und somit das konzept der kapselung untergräbt?
-
Das ganze Konzept ist etwas kompliziert zu erklären, aber im Wesentlichen habe ich eine Klasse Object die z.B. einen statischen Member "name" vom Typ "Property" hat. Initialisiert wird dieser Member mit der statischen Register-Funktion der Property Klasse, die einen Zeiger auf dieses Property in dem statischen Vector "propertyList" speichert.
Was ich nicht gesehen habe ist, dass ja dann der statische Member name der eigentliche Eigentümer dieses Properties ist und dieses damit wie von Volkard richtig gefolgert dann automatisch gelöscht wird. Habe mir also Gedanken über ein Problem gemacht, das gar keines ist.
Und das Konzept der Kapselung verletze ich nicht (glaube ich zumindest ;)), da alle Member und auch der Vector protected sind und auf diese nur über Funktionen zugegriffen wird.