From 40a54802f1d543c5bca8efb97e139cd569d6c8d3 Mon Sep 17 00:00:00 2001 From: deltaoscarmike <37912794+deltaoscarmike@users.noreply.github.com> Date: Sun, 10 Jun 2018 22:02:06 +0200 Subject: [PATCH] memleaks fixes --- .../MilkdropPresetFactory/Expr.cpp | 5 +++++ .../MilkdropPresetFactory/MilkdropPreset.cpp | 6 +----- .../MilkdropPresetFactory/Parser.cpp | 6 ++++++ .../MilkdropPresetFactory/PresetFrameIO.cpp | 5 ++++- src/libprojectM/PCM.cpp | 4 ++-- src/libprojectM/PCM.hpp | 3 ++- .../Renderer/RenderItemDistanceMetric.hpp | 7 ++++++- .../Renderer/RenderItemMergeFunction.hpp | 7 ++++++- src/libprojectM/projectM.cpp | 20 +++++++++++++++++-- src/projectM-sdl/pmSDL.cpp | 1 - 10 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/libprojectM/MilkdropPresetFactory/Expr.cpp b/src/libprojectM/MilkdropPresetFactory/Expr.cpp index 8a92c5465a..79bf4231b5 100755 --- a/src/libprojectM/MilkdropPresetFactory/Expr.cpp +++ b/src/libprojectM/MilkdropPresetFactory/Expr.cpp @@ -180,6 +180,11 @@ class MultAndAddExpr : public Expr a(_a), b(_b), c(_c) { } + ~MultAndAddExpr() { + delete a; + delete b; + delete c; + } float eval(int mesh_i, int mesh_j) { float a_value = a->eval(mesh_i,mesh_j); diff --git a/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.cpp b/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.cpp index bd94f6f46c..494454cdbc 100755 --- a/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.cpp +++ b/src/libprojectM/MilkdropPresetFactory/MilkdropPreset.cpp @@ -93,11 +93,7 @@ MilkdropPreset::~MilkdropPreset() delete(*pos); } customWaves.clear(); - customShapes.clear(); - presetOutputs().customWaves.clear(); - presetOutputs().customShapes.clear(); - presetOutputs().drawables.clear(); - + customShapes.clear(); } /* Adds a per pixel equation according to its string name. This diff --git a/src/libprojectM/MilkdropPresetFactory/Parser.cpp b/src/libprojectM/MilkdropPresetFactory/Parser.cpp index 47df19ce61..a6e87181f5 100755 --- a/src/libprojectM/MilkdropPresetFactory/Parser.cpp +++ b/src/libprojectM/MilkdropPresetFactory/Parser.cpp @@ -986,6 +986,10 @@ Expr * Parser::parse_gen_expr ( std::istream & fs, TreeExpr * tree_expr, Milkdr return NULL; //std::cout << gen_expr << std::endl; Expr *opt = gen_expr->optimize(); + + if (opt != gen_expr) { + delete gen_expr; + } //std::cout << opt << std::endl << std::endl; return opt; } @@ -2460,6 +2464,8 @@ int Parser::parse_shape_per_frame_init_eqn(std::istream & fs, CustomShape * cus line_mode = CUSTOM_SHAPE_PER_FRAME_INIT_LINE_MODE; init_cond->evaluate(true); + + delete init_cond; return PROJECTM_SUCCESS; } diff --git a/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.cpp b/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.cpp index b5374c2900..bdb2a4211a 100644 --- a/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.cpp +++ b/src/libprojectM/MilkdropPresetFactory/PresetFrameIO.cpp @@ -119,6 +119,10 @@ PresetOutputs::~PresetOutputs() this->rot_mesh = free_mesh(this->rot_mesh); this->orig_x = free_mesh(this->orig_x); this->orig_y = free_mesh(this->orig_y); + + customWaves.clear(); + customShapes.clear(); + drawables.clear(); } @@ -457,7 +461,6 @@ void PresetOutputs::Initialize ( int gx, int gy ) this->gy = gy; staticPerPixel = true; - setStaticPerPixel(gx,gy); assert(this->gx > 0); int x; diff --git a/src/libprojectM/PCM.cpp b/src/libprojectM/PCM.cpp index 5ce9d9a713..41bff45021 100755 --- a/src/libprojectM/PCM.cpp +++ b/src/libprojectM/PCM.cpp @@ -42,14 +42,14 @@ int PCM::maxsamples = 2048; // number of samples specified. #include PCM::PCM() { - initPCM( 2048 ); + _initPCM( 2048 ); #ifdef DEBUG std::cerr << "[PCM] MAX SAMPLES:" << maxsamples << std::endl; #endif } -void PCM::initPCM(int samples) { +void PCM::_initPCM(int samples) { int i; waveSmoothing = 0; diff --git a/src/libprojectM/PCM.hpp b/src/libprojectM/PCM.hpp index 5888e842e2..705ddef395 100755 --- a/src/libprojectM/PCM.hpp +++ b/src/libprojectM/PCM.hpp @@ -58,7 +58,6 @@ PCM { static int maxsamples; PCM(); ~PCM(); - void initPCM(int maxsamples); void addPCMfloat(const float *PCMdata, int samples); void addPCM16(short [2][512]); void addPCM16Data(const short* pcm_data, short samples); @@ -68,6 +67,8 @@ PCM { void freePCM(); int getPCMnew(float *PCMdata, int channel, int freq, float smoothing, int derive,int reset); +private: + void _initPCM(int maxsamples); }; diff --git a/src/libprojectM/Renderer/RenderItemDistanceMetric.hpp b/src/libprojectM/Renderer/RenderItemDistanceMetric.hpp index 1f9e0bbd3f..bc88096003 100644 --- a/src/libprojectM/Renderer/RenderItemDistanceMetric.hpp +++ b/src/libprojectM/Renderer/RenderItemDistanceMetric.hpp @@ -19,6 +19,7 @@ /// when they are dissimilar. If two render items cannot be compared, NOT_COMPARABLE_VALUE is returned. class RenderItemDistanceMetric : public std::binary_function { public: + virtual ~RenderItemDistanceMetric() { } const static double NOT_COMPARABLE_VALUE; virtual double operator()(const RenderItem * r1, const RenderItem * r2) const = 0; virtual TypeIdPair typeIdPair() const = 0; @@ -103,7 +104,11 @@ typedef std::map DistanceMetricMap; public: MasterRenderItemDistance() {} - virtual ~MasterRenderItemDistance() {} + virtual ~MasterRenderItemDistance() { + for (DistanceMetricMap::iterator it = _distanceMetricMap.begin(); it != _distanceMetricMap.end(); ++it) + delete (it->second); + _distanceMetricMap.clear(); + } inline void addMetric(RenderItemDistanceMetric * fun) { _distanceMetricMap[fun->typeIdPair()] = fun; diff --git a/src/libprojectM/Renderer/RenderItemMergeFunction.hpp b/src/libprojectM/Renderer/RenderItemMergeFunction.hpp index 6316641e6b..d07b035b80 100644 --- a/src/libprojectM/Renderer/RenderItemMergeFunction.hpp +++ b/src/libprojectM/Renderer/RenderItemMergeFunction.hpp @@ -39,6 +39,7 @@ inline bool interpolate(bool a, bool b, float ratio) /// when they are dissimilar. If two render items cannot be compared, NOT_COMPARABLE_VALUE is returned. class RenderItemMergeFunction { public: + virtual ~RenderItemMergeFunction() {} virtual RenderItem * operator()(const RenderItem * r1, const RenderItem * r2, double ratio) const = 0; virtual TypeIdPair typeIdPair() const = 0; }; @@ -201,7 +202,11 @@ typedef std::map MergeFunctionMap; public: MasterRenderItemMerge() {} - virtual ~MasterRenderItemMerge() {} + virtual ~MasterRenderItemMerge() { + for (MergeFunctionMap::iterator it = _mergeFunctionMap.begin(); it != _mergeFunctionMap.end(); ++it) + delete (it->second); + _mergeFunctionMap.clear(); + } inline void add(RenderItemMergeFunction * fun) { _mergeFunctionMap[fun->typeIdPair()] = fun; diff --git a/src/libprojectM/projectM.cpp b/src/libprojectM/projectM.cpp index d6e8f20596..76a1d4e833 100755 --- a/src/libprojectM/projectM.cpp +++ b/src/libprojectM/projectM.cpp @@ -101,6 +101,11 @@ projectM::~projectM() _pcm = 0; } + if(timeKeeper) { + delete timeKeeper; + timeKeeper = NULL; + } + delete(_pipelineContext); delete(_pipelineContext2); } @@ -117,7 +122,8 @@ void projectM::projectM_resetTextures() projectM::projectM ( std::string config_file, int flags) : -beatDetect ( 0 ), renderer ( 0 ), _pcm(0), m_presetPos(0), m_flags(flags), _pipelineContext(new PipelineContext()), _pipelineContext2(new PipelineContext()) +beatDetect ( 0 ), renderer ( 0 ), _pcm(0), m_presetPos(0), m_flags(flags), _pipelineContext(new PipelineContext()), _pipelineContext2(new PipelineContext()), + timeKeeper(NULL), _matcher(NULL), _merger(NULL) { readConfig(config_file); projectM_reset(); @@ -126,7 +132,8 @@ beatDetect ( 0 ), renderer ( 0 ), _pcm(0), m_presetPos(0), m_flags(flags), _pip } projectM::projectM(Settings settings, int flags): -beatDetect ( 0 ), renderer ( 0 ), _pcm(0), m_presetPos(0), m_flags(flags), _pipelineContext(new PipelineContext()), _pipelineContext2(new PipelineContext()) +beatDetect ( 0 ), renderer ( 0 ), _pcm(0), m_presetPos(0), m_flags(flags), _pipelineContext(new PipelineContext()), _pipelineContext2(new PipelineContext()), + timeKeeper(NULL), _matcher(NULL), _merger(NULL) { readSettings(settings); projectM_reset(); @@ -652,6 +659,15 @@ static void *thread_callback(void *prjm) { m_presetLoader = 0; + if (_matcher) { + delete _matcher; + _matcher = NULL; + } + + if (_merger) { + delete _merger; + _merger = NULL; + } } /// @bug queuePreset case isn't handled diff --git a/src/projectM-sdl/pmSDL.cpp b/src/projectM-sdl/pmSDL.cpp index 10b411fd0a..d324bdb8fa 100644 --- a/src/projectM-sdl/pmSDL.cpp +++ b/src/projectM-sdl/pmSDL.cpp @@ -97,7 +97,6 @@ void projectMSDL::beginAudioCapture() { // allocate a buffer to store PCM data for feeding in unsigned int maxSamples = audioChannelsCount * audioSampleCount; SDL_PauseAudioDevice(audioDeviceID, false); - pcm()->initPCM(2048); } void projectMSDL::endAudioCapture() {