Pointer
-
hallo,
ich komm egtl gut mit linux zurecht, aber grad bin ich total am ausrasten, weil ich manchmal speicherzugriffsfehler bekomm und manchmal nicht - hier der code
(coord_system.cpp)
#include <iostream> using namespace std; #include "coord_system.h" coord_system::coord_system(QMainWindow *parent) { parent->setMinimumSize(950, 650); parent->setMaximumSize(parent->minimumSize()); pxIcon = new QPixmap("icon/default.png"); if (!pxIcon->isNull()) { parent->setWindowIcon(QIcon(*pxIcon)); } parent->setWindowTitle("coord system :: blan-media.de"); gbPreview = new QGroupBox("Vorschau", parent); gbPreview->setGeometry(7, 0, 760, 643); // gbSize = new QGroupBox("Größe", parent); // gbSize->setGeometry(650, 0, 100, 100); gbCreate = new QGroupBox(QString::fromUtf8("Erstellen"), parent); gbCreate->setGeometry(776, 108, 167, 100); gbObjects = new QGroupBox(QString::fromUtf8("Objekte"), parent); gbObjects->setGeometry(776, 300, 167, 200); lstObjects = new QListWidget(gbObjects); lstObjects->setGeometry(5, 18, 157, 150); //pxDelObjects = new QPixmap("icon/delete.png"); pbDelObjects = new QPushButton(gbObjects); pbDelObjects->setGeometry(5, 172, 120, 18); pbDelObjects->setText(QString::fromUtf8("Löschen")); /* if (!pxDelObjects->isNull()) { pbDelObjects->setIcon(QIcon(*pxDelObjects)); } */ }
(coord_system.h)
#ifndef coord_system_h__ #define coord_system_h__ #include <QMainWindow> #include <QGroupBox> #include <QPixmap> #include <QIcon> #include <QListWidget> #include <QPushButton> class coord_system: public QWidget { private: QPixmap *pxIcon, *pxDelObjects; QGroupBox *gbPreview, *gbSize, *gbCreate, *gbObjects; QListWidget *lstObjects; QPushButton *pbDelObjects; protected: public: coord_system(QMainWindow *parent = 0); }; #endif // coord_system_h__
(main.cpp)
#include <iostream> using namespace std; #include <QApplication> #include "coord_system.h" int main(int argc, char **argv) { QApplication app(argc, argv); QMainWindow *main = new QMainWindow; int nResult = 0; coord_system *coord = new coord_system(main); main->show(); nResult = app.exec(); delete coord; delete main; return nResult; }
kann mir jemand helfen - BITTE
p.s: muss man mit "new" erstellte pointer in einer klasse im destruktor mit "delete" wieder freigeben?
bitte helft mir
mfg blan
-
blan schrieb:
p.s: muss man mit "new" erstellte pointer in einer klasse im destruktor mit "delete" wieder freigeben?
normalerweise ja, c++ ist doof und macht das nicht automatisch. musst du umgebungen mit garbage collector, java, .net o.ä. nehmen wenn du das willst
-
Die QObjects, die ein parent gesetzt haben, werden aber automatisch gelöscht, wenn das parent gelöscht wird. Für sämtliche Widgets muss man also typischerweise nichts machen.
-
okay, das mit den parents erklärt schonmal einiges, mir zeigt "valgrid" sogar bei den qt-demos 10 errors an - ist das normal?
wieso stürtzt denn mein prog (siehe oben) immer ab, also es kommt immer ein "Segmentation fault", hab mein Code nun soweit abgebaut, aber es wird nicht besser:
(main.cpp)
#include <iostream> using namespace std; #include <QApplication> #include "coord_system.h" int main(int argc, char **argv) { QApplication app(argc, argv); coord_system coord; coord.show(); return app.exec(); }
(coord_system.h)
#ifndef coord_system_h__ #define coord_system_h__ #include <QMainWindow> #include <QGroupBox> #include <QPixmap> #include <QIcon> #include <QListWidget> #include <QPushButton> class coord_system: public QWidget { private: QPixmap *pxIcon; QGroupBox *gbPreview; protected: public: coord_system(void); }; #endif // coord_system_h__
(coord_system.cpp)
#include <iostream> using namespace std; #include "coord_system.h" coord_system::coord_system(void) { this->setMinimumSize(950, 650); pxIcon = new QPixmap("icon/default.png"); if (!pxIcon->isNull()) { this->setWindowIcon(QIcon(*pxIcon)); } this->setWindowTitle("coord system :: blan-media.de"); gbPreview = new QGroupBox(QString::fromUtf8("Größe")); gbPreview->setGeometry(0, 0, 100, 100); }
kann mal jemand den code bei sich testen (bitte)
-> ich benutzer opensuse + kdevelop + qt4
(ich verzweifel echt)
-
valgrind findet immer Fehler!
Ansonsten benutz einfach den gdb, lass den durchlaufen und mach ein Stackbacktrace, wenn der Segfault kommt. Dann weißt du wo das Problem liegt.
Auf dem ersten Blick sehe ich kein Fehler, aber ich kenn mich mit Qt nicht aus. Vielleicht hast du QWidget nicht richtig initialisiert oder darfst ein QBitmap nicht einfach in ein QIcon casten etc.
btw. für automatische Speicherverwaltung nimmt man in C++ Smart Pointer, wie std::auto_ptr oder boost::shared_ptr/boost::scoped_ptr etc.
-
hi,
naja bei firefox findet er keine
wie verwende ich denn des mit gdb, kannste mir da nen bsp für kdevelop nennen?
mfg blan
-
Dein Programm macht hier keine Fehler und Valgrind meckert über nichts, was von dir verursacht wird. Das Programm sieht auch so aus, wie ich es erwarten würde.
-
kann ich daraus schließen, dass es an meinem computer liegt?
an was könnte es denn zB liegen? defekter arbeitsspeicher? opensuse?
mfg blan
-
blan schrieb:
kann ich daraus schließen, dass es an meinem computer liegt?
an was könnte es denn zB liegen? defekter arbeitsspeicher? opensuse?
mfg blan
Bist du sicher, dass du den gleichen Code kompilierst, den du beim zweiten Mal gepostet hast?
Hast du vorher sauber gemach? make clean
Ansonsten poste die Valgrind Fehlermeldung und die entsprechenden Zeilennummern.
-
hrm.. ich weiss net ob mich jetzt langsam mal aufhäng - jetzt klappt der erste code, liegts an dem make-clean?
wobei ich mir vorstellen kann das bald wieder son fehler kommt obwohl ich alles richtig prog - was soll ich dann tun
hier nochmal das valgrind von der LAUFENDEN anwendung:
workstation@workstation:~/coord_system/bin> valgrind coord_system -v ==6625== Memcheck, a memory error detector. ==6625== Copyright (C) 2002-2005, and GNU GPL'd, by Julian Seward et al. ==6625== Using LibVEX rev 1313, a library for dynamic binary translation. ==6625== Copyright (C) 2004-2005, and GNU GPL'd, by OpenWorks LLP. ==6625== Using valgrind-3.0.1.SVN, a dynamic binary instrumentation framework. ==6625== Copyright (C) 2000-2005, and GNU GPL'd, by Julian Seward et al. ==6625== For more details, rerun with: -v ==6625== ==6625== Syscall param write(buf) points to uninitialised byte(s) ==6625== at 0x1C1B7353: __write_nocancel (in /lib/tls/libpthread-2.3.5.so) ==6625== by 0x1BFAC27D: (within /usr/X11R6/lib/libX11.so.6.2) ==6625== by 0x1BFAC5AE: _X11TransWrite (in /usr/X11R6/lib/libX11.so.6.2) ==6625== by 0x1BF8FC34: (within /usr/X11R6/lib/libX11.so.6.2) ==6625== by 0x1BF8FD5C: _XReply (in /usr/X11R6/lib/libX11.so.6.2) ==6625== by 0x1BF7B2A2: XInternAtom (in /usr/X11R6/lib/libX11.so.6.2) ==6625== by 0x1BF990FA: XSetWMProperties (in /usr/X11R6/lib/libX11.so.6.2) ==6625== by 0x1BA8B897: QWidgetPrivate::create_sys(unsigned long, bool, bool) (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA5A435: QWidget::create(unsigned long, bool, bool) (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA5A620: QWidgetPrivate::init(QWidget*, QFlags<Qt::WindowType>) (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA5AAD1: QWidget::QWidget(QWidgetPrivate&, QWidget*, QFlags<Qt::WindowType>) (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BC47780: QMainWindow::QMainWindow(QWidget*, QFlags<Qt::WindowType>) (in /usr/lib/libQtGui.so.4.0.1) ==6625== Address 0x1C414FC8 is 272 bytes inside a block of size 16384 alloc'd ==6625== at 0x1B8FFB88: calloc (in /usr/lib/valgrind/vgpreload_memcheck.so) ==6625== by 0x1BF7FAE3: XOpenDisplay (in /usr/X11R6/lib/libX11.so.6.2) ==6625== by 0x1BA748BE: qt_init(QApplicationPrivate*, int, _XDisplay*, unsigned long, unsigned long) (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA23B5F: QApplicationPrivate::construct() (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA23EA4: QApplication::QApplication(int&, char**) (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x804B2CF: main (in /home/workstation/coord_system/bin/coord_system) ==6625== ==6625== Syscall param write(buf) points to uninitialised byte(s) ==6625== at 0x1C1B7353: __write_nocancel (in /lib/tls/libpthread-2.3.5.so) ==6625== by 0x1BE81FDD: (within /usr/X11R6/lib/libICE.so.6.3) ==6625== by 0x1BE824BE: _IceTransWrite (in /usr/X11R6/lib/libICE.so.6.3) ==6625== by 0x1BE7A745: _IceWrite (in /usr/X11R6/lib/libICE.so.6.3) ==6625== by 0x1BE7A821: IceFlush (in /usr/X11R6/lib/libICE.so.6.3) ==6625== by 0x1BE6C9F0: SmcSetProperties (in /usr/X11R6/lib/libSM.so.6.0) ==6625== by 0x1BA6145E: (within /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA63C62: (within /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA6898D: (within /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA69676: (within /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BE6EC66: _SmcProcessMessage (in /usr/X11R6/lib/libSM.so.6.0) ==6625== by 0x1BE7AF83: IceProcessMessages (in /usr/X11R6/lib/libICE.so.6.3) ==6625== Address 0x1C5A2BAC is 12 bytes inside a block of size 1024 alloc'd ==6625== at 0x1B8FFB88: calloc (in /usr/lib/valgrind/vgpreload_memcheck.so) ==6625== by 0x1BE776D8: IceOpenConnection (in /usr/X11R6/lib/libICE.so.6.3) ==6625== by 0x1BE6C219: SmcOpenConnection (in /usr/X11R6/lib/libSM.so.6.0) ==6625== by 0x1BA6791B: QSessionManager::QSessionManager(QApplication*, QString&, QString&) (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA23619: QApplicationPrivate::initialize() (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA23B68: QApplicationPrivate::construct() (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x1BA23EA4: QApplication::QApplication(int&, char**) (in /usr/lib/libQtGui.so.4.0.1) ==6625== by 0x804B2CF: main (in /home/workstation/coord_system/bin/coord_system) ==6625== ==6625== ERROR SUMMARY: 12 errors from 2 contexts (suppressed: 76 from 4) ==6625== malloc/free: in use at exit: 331426 bytes in 4526 blocks. ==6625== malloc/free: 87314 allocs, 82788 frees, 10661597 bytes allocated. ==6625== For counts of detected errors, rerun with: -v ==6625== searching for pointers to 4526 not-freed blocks. ==6625== checked 910180 bytes. ==6625== ==6625== LEAK SUMMARY: ==6625== definitely lost: 240 bytes in 9 blocks. ==6625== possibly lost: 0 bytes in 0 blocks. ==6625== still reachable: 331186 bytes in 4517 blocks. ==6625== suppressed: 0 bytes in 0 blocks. ==6625== Use --leak-check=full to see details of leaked memory.
finds nach wie vor irgendwie assi, das es trotzdem 12 errors findt o_O
mfg blan
-
Für diese Fehler kannst du nichts, die kann man ignorieren. In der GLIBC und vor allem im X11 Code gibt es viele Stellen, die valgrind anmeckert, die aber nicht zu Problemen führen und deshalb nicht gefixt werden. Die meisten Stellen sind schon in den suppression Dateien von valgrind drin. Manche aber nicht und auf diese bist du hier gestossen.
Hier mal ein Beispiel für einen Fehler, der grundsätzlich keiner ist:
Du hast ein Netzwerkprotokoll, das auf Nachrichten der Länge 10 basiert. Dabei ist das erste Byte eine Befehlsnummer und die restlichen 9 sind die Daten. Nun gibt es einen Befehl QUIT mit der Nummer 255, dessen Datenteil völlig egal ist und beim Empfänger nicht ausgewertet wird. Nun könnte der Code zum Senden grob so aussehen:
unsigned char buffer[10]; buffer[0] = QUIT_CMD; write(socket_fd, buffer, 10);
Valgrind meckert hier, dass hier 9 bytes versendet wurden, ohne initialisiert zu werden. Valgrind hat recht, kann aber nicht wissen, dass das hier völlig egal ist, da dies auf der anderen Seite nicht ausgewertet wird.
Wenn du dir nun deine Fehlermeldungen anschaust, dann siehst du, dass sie auch was mit dem write() Systemaufruf zu tun haben. Könnte doch eine ähnliche Situation sein, die überhaupt nicht asozial ist.
Also nicht ärgern, sondern einfach ignorieren.
-
Wenn ein make clean hilft und ein einfaches make nicht, dann ist das ein Zeichen unter anderem dafür, dass das Makefile nicht gut genug ist und alle Abhängigkeiten abbildet, oder die Zeit auf deinen Systemen nicht synchronisiert ist und make durcheinander kommt.
-
hrm - naja ich benutze kdevelop, das sollte doch die Makefile gut erstellen oder?