vector - delete bei Objekten?
-
Müssen die wie folgt erzeugten Objekte explizit bereinigt werden, oder übernimmt das der Vector für mich?
{ ... std::vector<Package> packages; packages.push_back(Package()); ... }
-
das übernimmt der vector nehm ich, allerding solltest du für die klasse deiner objekte einen destruktor haben welcher evtl. dynamisch allokierte Objekte in deinem Objekt bereinigt.
GRüße
-
Da mein problem zu diesem hier ganz gut passt, stelle ich die Frage hier, damit nicht unnötig ein neuer Thread eröffnet werden muss.
meine Klasse:
class ANN { ... NEURON *neurons; public: ANN(int iNneu, int iNwid); ~ANN(); ... };Kontruktor (erzeugt diverse Objekte der Klasse NEURON):
ANN::ANN(int iNneu, int iNwei) { std::vector<NEURON*> neurons; for (int x = 0; x < iWidth; x++) for (int y = 0; y < iHeight; y++) neurons.push_back (new NEURON( (float)x, (float)y, iNwei, 0) ); }Destruktor (soll alle Objekte der Klasse NEURON wieder zerstören und dabei auch den Destruktor der Klasse NEURON aufrufen).
Das hier funzt nicht:
ANN::~ANN() { for (int a = 0; a < iNneurons; a++) { delete neurons[a]; } }wo liegt der Fehler in dem Destruktor?
wie rufe ich den Destruktor der Klasse NEURON auf?
ich bin gerade im Umstieg von C auf C++, also verzeiht mir bitte meine anfänger-fragen

-
iNneurons -- was ist das vür ne variable? definiert is die net.
ebenfalls ist das neurons, in das du im konstruktor schreibst, lokal zum konstruktor, da du es neu deklarierst (als vector).
schreib besser:
class ANN { ... std::vector<NEURON*> neurons; public: ANN(int iNneu, int iNwid); ~ANN(); ... };ANN::ANN(int iNneu, int iNwei) { for (int x = 0; x < iWidth; x++) for (int y = 0; y < iHeight; y++) neurons.push_back (new NEURON( (float)x, (float)y, iNwei, 0) ); }ANN::~ANN() { while(neurons.size) { delete neurons.back(); neurons.pop_back(); } }
-
vielen dank

Funktionieren tut es. Ich hoffe dass ich dann soweit auch alles an Speicher wieder freigegeben habe. Bei verschachtelten Klassen bin ich noch etwas unsicher

Ich hoffe dass :
delete neurons.back();dann auch automatisch den NEURON::~NEURON() aufruft, weil dort auch noch Speicher freigegeben wird, der in der Klasse NEURON lokal verwendet wird.
Soll ja auch alles Sauber programmiert sein

-
ja. delete ruft zuerst den destruktor auf und gibt dann den speicher frei. also gibt das keine speicherlöcher

-
wundervoll! Vielen Dank

-
Wundert mich das der Code von piXelshooter geht. size ist keine Variable sondern eine Funktion!
ANN::ANN(int iNneu, int iNwei) { for (int x = 0; x < iWidth; x++) for (int y = 0; y < iHeight; y++) neurons.push_back (new NEURON( (float)x, (float)y, iNwei, 0) ); }. Hier beachten, das du eh in der Schleife werte > 0 erhälst (x = 0; x++) und deswegen unsigned angebracht ist. Dann Ist Preinkrementierung Postinkrementierung vorzuziehen

Und zu guter letzt castet man unter C++ nicht C-Style! (static_cast<float>(x) wäre besser!). Warum erzeugst du eigtl. überhaupt alles Zeiger? Nimm doch einfach #// std::vector<NEURON> neurons; neurons.push_back(NEURON(static_cast<float>(x), static_cast<float>(y), iNwei, 0));und spart dir damit das manuelle Aufräumen, da das dann vom vector selbst gemacht wird.