[gelöst] Destruktor wird nicht aufgerufen

Alles rund um die Programmierung mit Qt
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

[gelöst] Destruktor wird nicht aufgerufen

Beitrag von BartSimpson »

Hallo, ich habe ein Problem, das der Destruktor der Klasse beim abräumen nicht aufgerufen wird:(
Hier etwas Code

Code: Alles auswählen

QDlgHaupt::QDlgHaupt(QWidget *eltern): QMainWindow(eltern)
{
	Datenbank=new QDatenbankverbindung(this); 
	ui.setupUi(this);
....
}

Nur leider wied beim beenden des Programms der Destruktor von QDatenbankverbindung nicht aufgerufen, was dazu führt, das die DB Verbindung nicht sauber beendet wird.:(
Zuletzt geändert von BartSimpson am 17. April 2006 12:45, insgesamt 1-mal geändert.
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Re: Destruktor wird nicht aufgerufen

Beitrag von ChMaster »

BartSimpson hat geschrieben:Hallo, ich habe ein Problem, das der Destruktor der Klasse beim abräumen nicht aufgerufen wird:(
Hier etwas Code

Code: Alles auswählen

QDlgHaupt::QDlgHaupt(QWidget *eltern): QMainWindow(eltern)
{
	Datenbank=new QDatenbankverbindung(this); 
	ui.setupUi(this);
....
}

Nur leider wied beim beenden des Programms der Destruktor von QDatenbankverbindung nicht aufgerufen, was dazu führt, das die DB Verbindung nicht sauber beendet wird.:(
hast du mal versucht nach "ui.setupUi(this);" dies zu instanzieren?

bei mir gab es der gleichen problem, aber mit anderen instanzierungen .... gelöst habe ich es, wo ich zuerst
ui.setupUi(this); aurufe und dannach meine eigentlichen sachen.
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Ja leider das selbe:(
Der "Abreisser" wird nicht aufgerufen:(
ChMaster
Beiträge: 252
Registriert: 23. Februar 2005 14:44
Wohnort: RP -> Alzey
Kontaktdaten:

Beitrag von ChMaster »

wie löscht du im destruktor die daten?

mit

Code: Alles auswählen

QDlgHaupt::~QDlgHaupt() {
      delete Datenbank;
}
probier mal dies auch noch, dies in die header:

Code: Alles auswählen

    protected:
        void closeEvent( QCloseEvent *e );
und dies in die cpp:

Code: Alles auswählen

QDlgHaupt::closeEvent( QCloseEvent *e ) {
      e->accept();
      //..... hier code zum schliessen der datanbank
      //..... und zum löschen der objecte usw. etc. pp
}
ChMaster
------------ Projekte------------
DBoxFE
DMS
First4 (Plugin-Develper)
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Ist die QDatenbankverbindung von QObject abgeleitet?

Also:

Code: Alles auswählen

QDatenbankverbindung::QDatenbankverbindung( QObject *pParent )
        : QObject( pParent )
{
}
Wenn es so ist, dann sollte Qt das Aufräumen für dich übernehmen -> Pointer deleten und Destruktor aufrufen.

Wenn nicht, musst du den Code entweder entsprechend ändern, oder dich selbst um das Löschen kümmern.


SG Alexander
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Ja die DB Klasse ist von Object abgeleitet, da Slots und Signale benutzt werden.
Es geht aber nicht darum den Heap aufzuräumen sondern beim Beenden die DB sauber zu schließen.
Das Datenbank Objekt wird nicht gelöscht. Das übernimmt ja Qt.
Da das Datenbankobjekt ja den Dialog als Eltern hat.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wird denn überhaupt der Destruktur von QDlgHaupt aufgerufen?
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Keine Ahung. Da ich dort keinen benötige habe ich die Sache dem Compiler überlassen.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Komische Logik. Wenn der Parent nicht gelöscht wird, werden auch die Childs nicht gelöscht...
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Da am Ende Qt alles aufräumt. Nur anscheinet werdend dabei nicht die Destruktoren der Klassen aufgerufen:(
Timewarp
Beiträge: 23
Registriert: 4. November 2005 21:09
Wohnort: Deutschland

Beitrag von Timewarp »

Erbt die DB-Klasse noch von was anderem als QObject ?
Hast du mal versucht die Destruktoren als virtual zu deklarieren ?
patrik08
Beiträge: 746
Registriert: 27. Februar 2006 10:48
Wohnort: DE Freiburg

Beitrag von patrik08 »

QPointer ist ein zauberwort! ( die suche in diesen forum nach qpointer gibt sehr weniger resultate [scheinbar ist das was neues! ich bin neu im c++ aber seit 9 Jahren schreibe ich class in php .. dort sowas zu haben ist luxus..]) ich hatte das selbe problem ... mit dem destructor ...

habe sogar log gemacht da ich qdebug zu wenig begreife...

Code: Alles auswählen

SQLdb::~SQLdb()
{
 logSQL(QString( "Last insert kommst du?? \"%1\" um Unixtime " ).arg( int2char(  (int)time( NULL ) ) ));
}
in php mache ich
classe

function...construct ()
{
/* und der construct weitergeben an die erben mit */
parent:construct()
}

das selbe mit dem destruct .... aber in C fand ich dass gar nicht ... bis ich am pasnox fragte diese forum () was eigentlich Qpointer sind?
da er in seinem qt studio programm (suche qpointer in dieses forum) reichglich qpointer vorhanden sind in seine template um die ui file zu source und header zu bringen..

http://www.qtforum.de/forum/viewtopic.p ... t=qpointer

also brachte ich den destructor ganz nach vorne bis zur main....

Code: Alles auswählen

 Gui_Front::self()->setWindowTitle( _PROGRAM_TITLE );
	Gui_Front::self()->show();
    a.connect( &a, SIGNAL( lastWindowClosed() ), &a, SLOT( Gui_By::self()->show() ) );
    return a.exec();
der Gui_By ist wie einen ende splash screen und mit qtimer ist er nur 2sek offen und ein slot macht Ihn dann zu ... und von dort rufe ich ein destructor von der Config class ....

es schein sogar fuer mich kompliziert aber es geht...
ciao

und jede class hat eine verbindung unter-einnander
im grunde genommen ist dann jede verbundene classe eine einzige grosse ... das programm...

Code: Alles auswählen


QPointer<Gui_Front> Gui_Front::_self = 0L;

Gui_Front* Gui_Front::self( QWidget* parent )
{
	if ( !_self )
		_self = new Gui_Front( parent );
	return _self;
}

/*  ------------- dort vo die qpointer sind .. klemme ich alle notwendige classen ... ---------------------  */

class Gui_Front : public QMainWindow, public Config, public Ui::Gui_Front

/*  so kann ich auch die einzelne dialog steuern...*/

void Gui_Front::OpenRemoteDialog()
{
    /*  Here is QMainWindow  */
    /*  grap vars from theurltoopen text field */
    Gui_Open_Remote_Dialog::self( this )->exec(); 
    if (Gui_Open_Remote_Dialog::_self ) {
    QString Parent_Text_Url = Gui_Open_Remote_Dialog::_self->theurltoopen->text();
        if (!IsNetFile( Parent_Text_Url )) {   /* and bool button is accept/reject */
               if (Parent_Text_Url.size() > 0) {
               /* message box */
               msgb->information( this , "Ther Url......... ", "Sorry: Url is not valid! "+ Parent_Text_Url ); 
               Gui_Open_Remote_Dialog::self( this )->exec();
               }
        } else {
             if (Parent_Text_Url.size() > 2) {
                SetFileOrUrl(Parent_Text_Url);
             }
        }
    }        
}

BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

QPointer gibt es seit ein kurzen. Und über deren Sinn läßt sich prima streiten. Schon alleine wegen den eingeschränken Verwendungsmöglichkeiten. In diesem Fall würde sich kein Vorteil daraus ergeben. Virtuelle Destruktoren haben auch nix geholfen. Da ja von QObject geerbt wird, muss ja der von QObject virtuell sein. Was er ja auch ist.(Laut Doku).
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag von Nassian »

Vielleicht hab ich die Antwort überlesen, aber wird der Dialog gelöscht? Weil wenn der nicht gelöscht wird, werden auch seine Kinder nicht gelöscht und folglich wird dein Destruktor nicht aufgerufen.
BartSimpson
Beiträge: 1379
Registriert: 6. November 2004 12:03
Kontaktdaten:

Beitrag von BartSimpson »

Ich glaube ich habe das Problem gefunden.
Das Datenbank Objekt ist das Kind vom Hauptdialog.
Nur den habe ich nur mit QDlgHaupt *Hauptfenster=new QDlgHaupt();
erstellt und damit hänget er etwas in der Luft.:(
Lösung:
QDlgHaupt *Hauptfenster=new QDlgHaupt();
durch QDlgHaupt Hauptfenster;
zu ersetzen.
Antworten