From 6d4c50255a6265f22b39033703f127ae231a4b5c Mon Sep 17 00:00:00 2001 From: Steve Herrell Date: Wed, 10 Nov 2010 08:50:54 -0500 Subject: [PATCH] Various memory leaks found by valgrind/code review. Many thanks to Jan for the much neater fast_demo.cc patch. --- rtengine/common.h | 2 ++ rtengine/dcraw.cc | 4 ++++ rtengine/fast_demo.cc | 21 ++++++++++++--------- rtgui/cropwindow.cc | 2 +- rtgui/cropwindow.h | 2 +- rtgui/multilangmgr.cc | 2 +- 6 files changed, 21 insertions(+), 12 deletions(-) diff --git a/rtengine/common.h b/rtengine/common.h index 760a2144f..376417251 100644 --- a/rtengine/common.h +++ b/rtengine/common.h @@ -97,6 +97,8 @@ struct RawImage { if(allocation){ delete [] allocation; allocation=NULL;} if(data){ delete [] data; data=NULL;} if(profile_data){ delete [] profile_data; profile_data=NULL;} + if ( make ) free(make); + if ( model ) free(model); } int loadRaw (bool loadData=true); diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index ebe1073ec..6880cb718 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -9096,6 +9096,10 @@ int RawImage::loadRaw (bool loadData) { } free(image); // we don't need this anymore } + else + { + fclose(ifp); + } return 0; } diff --git a/rtengine/fast_demo.cc b/rtengine/fast_demo.cc index 7bbafb04c..b86a350ec 100644 --- a/rtengine/fast_demo.cc +++ b/rtengine/fast_demo.cc @@ -25,7 +25,14 @@ //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +static float dirwt[0x10000]; +static void __attribute__((constructor)) setup_dirwt() +{ + //set up directional weight function + for (int i=0; i<0x10000; i++) + dirwt[i] = 1.0/SQR(1.0+i); +} void RawImageSource::fast_demo(int winx, int winy, int winw, int winh) { //int winx=0, winy=0; @@ -43,7 +50,9 @@ void RawImageSource::fast_demo(int winx, int winy, int winw, int winh) { int clip_pt = 4*65535*ri->defgain; //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - +#pragma omp parallel + { +#pragma omp for //first, interpolate borders using bilinear for (int i=0; isetProgress(0.05); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - float * dirwt = new float [0x20000]; + - //set up directional weight function - for (int i=0; i<0x10000; i++) - dirwt[i] = 1.0/SQR(1.0+i); - -#pragma omp parallel - { #pragma omp for // interpolate G using gradient weights diff --git a/rtgui/cropwindow.cc b/rtgui/cropwindow.cc index b52535317..6f2751368 100644 --- a/rtgui/cropwindow.cc +++ b/rtgui/cropwindow.cc @@ -73,7 +73,7 @@ CropWindow::CropWindow (ImageArea* parent, rtengine::StagedImageProcessor* ipc_) bZoomIn = new LWButton (safe_create_from_png (argv0+"/images/gtk-zoom-in.png"), 0, NULL, LWButton::Left, LWButton::Center, "Zoom In"); bZoomOut = new LWButton (safe_create_from_png (argv0+"/images/gtk-zoom-out.png"), 1, NULL, LWButton::Left, LWButton::Center, "Zoom Out"); bZoom100 = new LWButton (safe_create_from_png (argv0+"/images/gtk-zoom-100.png"), 2, NULL, LWButton::Left, LWButton::Center, "Zoom 100/%"); - bZoomFit = new LWButton (safe_create_from_png (argv0+"/images/gtk-zoom-fit.png"), 3, NULL, LWButton::Left, LWButton::Center, "Zoom Fit"); + //bZoomFit = new LWButton (safe_create_from_png (argv0+"/images/gtk-zoom-fit.png"), 3, NULL, LWButton::Left, LWButton::Center, "Zoom Fit"); bClose = new LWButton (safe_create_from_png (argv0+"/images/gtk-close.png"), 4, NULL, LWButton::Right, LWButton::Center, "Close"); buttonSet.add (bZoomIn); diff --git a/rtgui/cropwindow.h b/rtgui/cropwindow.h index 59b7129fc..396227a4a 100644 --- a/rtgui/cropwindow.h +++ b/rtgui/cropwindow.h @@ -53,7 +53,7 @@ class CropWindow : public LWButtonListener, public CropHandlerListener { // decoration Cairo::RefPtr resizeSurface; - LWButton *bZoomIn, *bZoomOut, *bZoom100, *bZoomFit, *bClose; + LWButton *bZoomIn, *bZoomOut, *bZoom100, /**bZoomFit,*/ *bClose; LWButtonSet buttonSet; Glib::ustring cropLabel; int backColor; diff --git a/rtgui/multilangmgr.cc b/rtgui/multilangmgr.cc index 44e81b6b1..02fdd0707 100644 --- a/rtgui/multilangmgr.cc +++ b/rtgui/multilangmgr.cc @@ -37,7 +37,7 @@ bool MultiLangMgr::load (Glib::ustring fname, MultiLangMgr* fb) { char* buffer = new char[2048]; - while ((buffer = fgets (buffer, 2048, f))) { + while (fgets (buffer, 2048, f) != 0) { // find separator int seppos = 0; while (buffer[seppos]!=0 && buffer[seppos]!=';')