c++ - Invalid pointer - Memory - Qt -


i'd tell strange problem have qt application.

i have 2 windows: first qmainwindow, second qdialog derived class. qmainwindow shows qdialog one, has form , qpushbutton in order use qfiledialog::getopenfilename.

when run app first time (after system boot) have memory problem:

*** error in `/home/nico/documents/projets_qtcreator/build-utilitairetwsgraph-kit_test-debug/utilitairetwsgraph': free(): invalid pointer: 0x000000000090cd40 *** 

to reproduce problem have restart system, think it's typically corrupted memory error. did investigations:

first, tried find incriminated line using gdb. told me:

program received signal sigabrt, aborted. 0x00007ffff63ac037 in __gi_raise (sig=sig@entry=6) @ ../nptl/sysdeps/unix/sysv/linux/raise.c:56 56  ../nptl/sysdeps/unix/sysv/linux/raise.c: aucun fichier ou dossier de ce type. 

the stack trace showed:

(gdb) #0  0x00007ffff63ac037 in __gi_raise (sig=sig@entry=6) @ ../nptl/sysdeps/unix/sysv/linux/raise.c:56 #1  0x00007ffff63af698 in __gi_abort () @ abort.c:90 #2  0x00007ffff63e95ab in __libc_message (do_abort=do_abort@entry=2, fmt=fmt@entry=0x7ffff64fc860 "*** error in `%s': %s: 0x%s ***\n")     @ ../sysdeps/unix/sysv/linux/libc_fatal.c:199 #3  0x00007ffff63f5a46 in malloc_printerr (ptr=0x90cd40, str=0x7ffff64f8825 "free(): invalid pointer", action=3) @ malloc.c:4902 #4  _int_free (av=<optimized out>, p=0x90cd30, have_lock=0) @ malloc.c:3758 #5  0x00007fffeea21d76 in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #6  0x00007ffff50f6538 in g_object_unref () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #7  0x00007fffeea0f21b in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #8  0x00007fffeea13584 in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #9  0x00007ffff50f6538 in g_object_unref () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #10 0x00007fffee9b59ea in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #11 0x00007fffee9eaf5f in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #12 0x00007ffff50f155e in g_closure_invoke () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #13 0x00007ffff51030e4 in ?? () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #14 0x00007ffff510ad11 in g_signal_emit_valist () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #15 0x00007ffff510af92 in g_signal_emit () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #16 0x00007fffeea8f580 in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #17 0x00007ffff50f7640 in g_object_run_dispose () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #18 0x00007fffee9b59ea in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #19 0x00007fffee9eaf5f in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #20 0x00007ffff50f155e in g_closure_invoke () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #21 0x00007ffff51030e4 in ?? () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #22 0x00007ffff510ad11 in g_signal_emit_valist () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #23 0x00007ffff510af92 in g_signal_emit () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #24 0x00007fffeea8f580 in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #25 0x00007ffff50f7640 in g_object_run_dispose () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #26 0x00007fffee9eaf5f in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #27 0x00007ffff50f1620 in g_closure_invoke () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #28 0x00007ffff51030e4 in ?? () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #29 0x00007ffff510ad11 in g_signal_emit_valist () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #30 0x00007ffff510af92 in g_signal_emit () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #31 0x00007fffeea8f580 in ?? () /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 #32 0x00007ffff50f7640 in g_object_run_dispose () /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0 #33 0x00007ffff7684879 in ?? () /usr/lib/x86_64-linux-gnu/libqtgui.so.4 #34 0x00007ffff77c537a in qfiledialog::getopenfilename(qwidget*, qstring const&, qstring const&, qstring const&, qstring*, qflags<qfiledialog::option>) ()    /usr/lib/x86_64-linux-gnu/libqtgui.so.4 #35 0x0000000000409277 in fenetreselectionstatusmonitor::selectionnerstatusmonitor (this=0x825710)     @ ../utilitairetwsgraph/dev/src/vue/fenetreselectionstatusmonitor.cpp:89 

so guessed problem in getopenfilename call.

then, remove modality property of qdialog (had no effects), used valgrind didn't helped me:

 invalid free() / delete / delete[] / realloc() ==2237==    @ 0x4c2ba6c: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==2237==    0xe194d75: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.17) ==2237==    0x78f3537: g_object_unref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0xe18221a: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.17) ==2237==    0xe186583: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.17) ==2237==    0x78f3537: g_object_unref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0xe1289e9: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.17) ==2237==    0xe15df5e: ??? (in /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0.2400.17) ==2237==    0x78ee55d: g_closure_invoke (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0x79000e3: ??? (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0x7907d10: g_signal_emit_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0x7907f91: g_signal_emit (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==  address 0x155066d0 720 bytes inside block of size 1,008 alloc'd ==2237==    @ 0x4c2a896: memalign (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==2237==    0x4c2a987: posix_memalign (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==2237==    0x6f22a07: ??? (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3600.0) ==2237==    0x6f6c3eb: g_slice_alloc (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3600.0) ==2237==    0x6f6c445: g_slice_alloc0 (in /lib/x86_64-linux-gnu/libglib-2.0.so.0.3600.0) ==2237==    0x790e8c4: g_type_create_instance (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0x78f9a4b: g_param_spec_internal (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0x78fda11: g_param_spec_object (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0xd98d4cb: ??? (in /usr/lib/x86_64-linux-gnu/libgio-2.0.so.0.3600.0) ==2237==    0x790c955: g_type_class_ref (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0x78f535c: g_object_new_valist (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237==    0x78f5803: g_object_new (in /usr/lib/x86_64-linux-gnu/libgobject-2.0.so.0.3600.0) ==2237== 

when don't use native dialog, don't have problem. think system dependency or package error, have other application uses getopenfilename (quite same call), can compile , works.

the getopenfilename call in qt slot:

void fenetreselectionstatusmonitor::selectionnerstatusmonitor() {     qfiledialog::getopenfilename(this, tr("fichier descriptif du status monitor"), "/home",tr("lst (*.lst)")); } 

the header file (i removed useless declarations):

#ifndef fenetre_selection_status_monitor #define fenetre_selection_status_monitor  #include <qfiledialog>  class fenetreselectionstatusmonitor : public qdialog {     q_object     public:         fenetreselectionstatusmonitor(int hauteur, int largeur, qwidget* parent);      private slots:         void selectionnerstatusmonitor(); };  #endif // fenetre_selection_status_monitor 

i think i'll try reinstall qt packages because don't have ideas now. checked calling arguments, without finding anything. i'm asking me questions because of lack of stability of program. , if had no problems, don't know how prove program not crash , has no memory leack (valgrind libraries hard use),it's quite desesperating !

thanks lot reading post, hope can me :)

edit: bought new project, having simple qmainwindow calling qdialog calls getopenfilename. have same problem.

this new project has 2 classes , main:

main.cpp:

#include <qapplication> #include "mainwindowtest.h"  int main(int argc, char** argv) {     qapplication app(argc,argv);     mainwindowtest window;     window.show();      return app.exec(); } 

mainwindowtest.h:

#ifndef main_window_test_h #define main_window_test_h  #include <qmainwindow> #include <qwidget> #include <qhboxlayout> #include <qpushbutton> #include "dialogtest.h"  class mainwindowtest : public qmainwindow {     q_object      public:         mainwindowtest();      private slots:         void opendialog(); };  #endif //main_window_test_h     

dialogtest.h:

#ifndef dialog_test_h #define dialog_test_h  #include <qdialog> #include <qwidget> #include <qhboxlayout> #include <qpushbutton> #include <qfiledialog>  class dialogtest : public qdialog {     q_object      public:         dialogtest();      private slots:         void openfile(); };  #endif //dialog_test_h 

mainwindowtest.cpp

#include "mainwindowtest.h"  mainwindowtest::mainwindowtest() {     setminimumsize(200,200);      qwidget* widget = new qwidget();     qhboxlayout* layout = new qhboxlayout();     qpushbutton* btnopen = new qpushbutton("open dialog");     connect(btnopen, signal(clicked()), this, slot(opendialog()));     layout->addwidget(btnopen);      widget->setlayout(layout);     setcentralwidget(widget); }  void mainwindowtest::opendialog() {     dialogtest dialog;     dialog.exec(); } 

dialogtest.cpp

#include "dialogtest.h"  dialogtest::dialogtest() {     qhboxlayout* layout = new qhboxlayout();     qpushbutton* btnopen = new qpushbutton("open file");     connect(btnopen, signal(clicked()), this, slot(openfile()));     layout->addwidget(btnopen);      setlayout(layout); }  void dialogtest::openfile() {     qfiledialog::getopenfilename(this, tr("fichier descriptif du status monitor"), "/home", tr("lst (*.lst)")); } 


Comments