Qt: bloß keine Waisenkinder instantiieren
Wenn man in Qt eine Klasse implementiert, sollte man tunlichst darauf achten, dass alle instantiierten Attribute
Das Elternelement hier ist
Also besser gut aufpassen bei so was, sonst kann das Debugging richtig ätzend werden.
this
als parent haben.
Andernfalls kann es nämlich sein, dass irgendwann der Garbage-Kollektor auf das offenbar elternlose Kind-Objekt stößt und es im Sinne von "ist das Kunst oder kann das weg" in die Tonne wirft.
Und dann hat man den Salat.
Ist mir hiermit passiert:
- class Measurement : public Object
- {
- Q_OBJECT
- public:
- Measurement(QObject* parent = 0);
- ~Measurement();
- };
- class XYPlot : public QQuickPaintedItem
- {
- Q_OBJECT
- public:
- XYPlot(QQuickPaintedItem* parent = 0);
- private:
- Measurement m_Measurement;
- };
XYPlot
, welches ein Attribut der Klasse Measurement
besitzt.
Bei mir gab es unreproduzierbare SIGSEGV segmentation faults, was immer auf irgendein Problem mit ungültigem Pointer hinweist.
Beim Debuggen habe ich dann festgestellt, dass kurz zuvor der Dekonstruktor von Measurement
aufgerufen wurde - obwohl das zugehörige XYPlot-Objekt noch existierte.
Woran lag es? ⇒ Ich hatte vergessen, dem Kind-Objekt zu sagen wer sein parent ist. Im Konstruktor der Elternklasse XYPlot
also m_Measurement
mit this
instantiieren:
- XYPlot::XYPlot( QQuickPaintedItem* parent) : QQuickPaintedItem(parent), m_Measurement(this)
- {
- }