Speicherleck (valgrind) und class geoPoint& operator*( ... )
-
Hallo zusammen,
ich habe bisher diese Routine um eine Skalar-Vektor-Multiplikation auszuführen, welche mir von Valgrind(Memory Leak Toolset) als ein Speicherleck angezeigt wird und eigentlich auch zurecht, aber wie sie umzuformulieren ist, wüßte ich jetzt nicht.
class geoVector& operator*(const double &lhs, const class geoPoint &rhs) { class geoVector *tmp = new class geoVector[1]; // hier ist das Leck, aber wie double dValue[3] = { 0., 0., 0. }; // greife ich auf class geoVector& im Funktions-Rumpf zu ? const double *coord = rhs.getData(); dValue[0]=lhs*coord[0]; dValue[1]=lhs*coord[1]; dValue[2]=lhs*coord[2]; tmp->setSpecial(*dValue); return *tmp; }Danke schonmal für durchlesen...
Winn
-
Was spricht denn dagegen, eine einfache Variable zu verwenden?
geoVector operator*(const double &lhs, const class geoPoint &rhs)//bitte hier keine Referenz zurückgeben { geoVector tmp double dValue[3] = { 0., 0., 0. }; ... tmp.setSpecial(*dValue); return tmp; }(btw, Referenzen sind zwar schön und gut, aber kein Allheilmittel - in diesem Fall ist es wohl einfacher, eine Kopie zurückzugeben)
-
CStoll schrieb:
Was spricht denn dagegen, eine einfache Variable zu verwenden? (btw, Referenzen sind zwar schön und gut, aber kein Allheilmittel - in diesem Fall ist es wohl einfacher, eine Kopie zurückzugeben)
An sich spricht da überhaupt nichts gegen, bleibt denn "geoVector tmp" nach Ende der geschweiften Klammer "}" am Leben oder wird es wegen statischer Speicher-Allokation vernichtet ? Ich probiere das mal eben aus...
-
Die bleibt natürlich nicht am Leben, weil sie nur lokal definiert wird. Nach der {-Klammer ist sie Geschichte. Sie braucht aber auch nicht am Leben bleiben, weil eine Kopie von tmp zurückgegeben wird.
rya.
-
es wird vernichtet, daher gibst du ja die kopie als variable zurück
-
Die lokale Variable bleibt natürlich nicht am Leben, wenn die Funktion beendet wird - aber mit der return-Anweisung wird eine Kopie dieser Variable angelegt, die das Funktionsende überlebt.
-
CStoll schrieb:
Die lokale Variable bleibt natürlich nicht am Leben, wenn die Funktion beendet wird - aber mit der return-Anweisung wird eine Kopie dieser Variable angelegt, die das Funktionsende überlebt.
Das wußte ich nicht, d.h. durch jede "return object" Anweisung wird eine Kopie von "object" erstellt. Wie detailliert ist diese Kopie ? Wird nur die Adresse kopiert oder auch alles was dahinter hängt ?
-
Die Kopie ist so vollständig, wie es die Klasse erfordert - d.h. hierfür wird der Copy-Ctor deiner Klasse verwendet.
(obwohl es noch Möglichkeiten für den Compiler gibt, das zu optimieren - siehe "(n)rvo")
-
class geoVector *tmp = new class geoVector[1];Ich hoffe, du benutzt dann auch delete[] ? Andernfalls hätte valgrind völlig recht. Unabhängig davon ist der Rest der Diskussion absolut beachtenswert.