Seite 1 von 2
[gelöst] Destruktor wird nicht aufgerufen
Verfasst: 16. April 2006 11:25
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.

Re: Destruktor wird nicht aufgerufen
Verfasst: 16. April 2006 11:50
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.
Verfasst: 16. April 2006 12:18
von BartSimpson
Ja leider das selbe:(
Der "Abreisser" wird nicht aufgerufen:(
Verfasst: 16. April 2006 13:51
von ChMaster
wie löscht du im destruktor die daten?
mit
probier mal dies auch noch, dies in die header:
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
}
Verfasst: 16. April 2006 14:13
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
Verfasst: 16. April 2006 14:29
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.
Verfasst: 16. April 2006 21:50
von upsala
Wird denn überhaupt der Destruktur von QDlgHaupt aufgerufen?
Verfasst: 16. April 2006 21:57
von BartSimpson
Keine Ahung. Da ich dort keinen benötige habe ich die Sache dem Compiler überlassen.
Verfasst: 16. April 2006 22:54
von upsala
Komische Logik. Wenn der Parent nicht gelöscht wird, werden auch die Childs nicht gelöscht...
Verfasst: 17. April 2006 00:08
von BartSimpson
Da am Ende Qt alles aufräumt. Nur anscheinet werdend dabei nicht die Destruktoren der Klassen aufgerufen:(
Verfasst: 17. April 2006 00:35
von Timewarp
Erbt die DB-Klasse noch von was anderem als QObject ?
Hast du mal versucht die Destruktoren als virtual zu deklarieren ?
Verfasst: 17. April 2006 01:46
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);
}
}
}
}
Verfasst: 17. April 2006 10:55
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).
Verfasst: 17. April 2006 12:08
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.
Verfasst: 17. April 2006 12:17
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.