Ich habe offenbar etliche Memory Lecks in einem meiner Programme. Einiges konnte ich mit Hilfe von Valgrind auch schon beseitigen, aber leider nicht alles.
Dazu kommt dann auch noch, das möglicherweise nicht alle Probleme von mir verursacht sein müssen. Denn hier steht z.B.
... In this example, Memcheck can't identify the address. Actually the address is on the stack, but, for some reason, this is not a valid stack address – it is below the stack pointer, %esp, and that isn't allowed. In this particular case it's probably caused by gcc generating invalid code, a known bug in various flavours of gcc.
Von daher bin ich nicht sicher, welche Fehler ich selber produziert habe.
Hier mal ein echtes Problem:
==8809== 31,680 bytes in 1 blocks are definitely lost in loss record 458 of 464 ==8809== at 0x4C3089F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==8809== by 0x12322F: ImageT::scale_down_av(ImageData*, int, int) (ImageTools.cpp:87) ==8809== by 0x11F54F: MainWindow::thumbs_init(ThumbBox*) (tview.cpp:1222) ==8809== by 0x11EAD2: MainWindow::scan_dir() (tview.cpp:979) ==8809== by 0x11E6C5: MainWindow::dir_tree_cb(Fl_Widget*, void*) (tview.cpp:820) ==8809== by 0x125BC4: DirTree::do_callback(int) (DirTree.cpp:480) ==8809== by 0x125557: DirTree::callback_deferred(void*) (DirTree.cpp:205) ==8809== by 0x14A4E6: Fl::wait(double) (in /home/manfred/prog/img/tview/tview) ==8809== by 0x14A5F1: Fl::run() (in /home/manfred/prog/img/tview/tview) ==8809== by 0x11FA2C: main (tview.cpp:1361)
Wenn ich das richtig verstanden habe, muss man den Ablauf von unten nach oben lesen. Tatsächlich wird der Speicher für die neuen Bilddaten in
ImageTools::scale_down_av( ImageData * img, int nw, int nh )
reserviert und an ein anders Objekt (ThumbBox) weiter gegeben.
... 87 n_array = new unsigned char [nw * nh * depth]; ... 114 new_image = new Fl_RGB_Image( n_array, nw, nh, depth ); ... 117 return new_image; }
Freigegeben wird dieser Speicher (ein flaches Objekt) im Destruktor von ThumbBox, was Valgrind offenbar nicht sieht. Wie kann ich jetzt fest stellen, was da wirklich los ist?