diff --git a/docs/notes.txt b/docs/notes.txt index 1d7ab80..1f6fd27 100644 --- a/docs/notes.txt +++ b/docs/notes.txt @@ -52,3 +52,15 @@ perf record --pid=XXXXX - Analyse using https://github.com/KDAB/hotspot + +Memcheck +-------- + +To generate memory usage plots in [massif format](https://valgrind.org/docs/manual/ms-manual.html): + + G_SLICE=always-malloc valgrind --tool=massif ./vimix + +To check for memory leaks: + + G_SLICE=always-malloc valgrind --leak-check=full --log-file=vimix_mem.txt ./vimix + diff --git a/src/Grid.cpp b/src/Grid.cpp index 7111eec..be6ebb8 100644 --- a/src/Grid.cpp +++ b/src/Grid.cpp @@ -34,6 +34,12 @@ Grid::Grid(Group *parent, Shapes s) : active_(false), shape_(s), unit_(UNIT_DEFA } +Grid::~Grid() +{ + if (root_) + delete root_; +} + glm::vec2 Grid::step() const { if ( shape_ != GRID_POLAR ) diff --git a/src/Grid.h b/src/Grid.h index 532d88f..6bccf5a 100644 --- a/src/Grid.h +++ b/src/Grid.h @@ -15,7 +15,7 @@ public: } Shapes; Grid(Group *parent, Shapes s = GRID_ORTHO); - virtual ~Grid() {} + virtual ~Grid(); // if active, the view will use it to approximate coordinates inline bool active() const { return active_; } diff --git a/src/GstToolkit.cpp b/src/GstToolkit.cpp index 72c9637..af51d69 100644 --- a/src/GstToolkit.cpp +++ b/src/GstToolkit.cpp @@ -268,13 +268,14 @@ std::string GstToolkit::used_gpu_decoding_plugins(GstElement *gstbin) { GstElement *e = static_cast(g_value_peek_pointer(&value)); if (e) { - const gchar *name = gst_element_get_name(e); + gchar *name = gst_element_get_name(e); for (int i = 0; i < N; i++) { if (std::string(name).find(plugins[i]) != std::string::npos) { found = plugins[i]; break; } } + g_free(name); } } g_value_unset(&value); diff --git a/src/MediaPlayer.cpp b/src/MediaPlayer.cpp index e0533f9..15cb374 100644 --- a/src/MediaPlayer.cpp +++ b/src/MediaPlayer.cpp @@ -747,8 +747,10 @@ void MediaPlayer::Frame::unmap() void MediaPlayer::pipeline_terminate( GstElement *p ) { #ifdef MEDIA_PLAYER_DEBUG - g_printerr("MediaPlayer %s close\n", gst_element_get_name(p)); - Log::Info("MediaPlayer %s closed", gst_element_get_name(p)); + gchar *name = gst_element_get_name(p); + g_printerr("MediaPlayer %s close\n", name); + Log::Info("MediaPlayer %s closed", name); + g_free(name); #endif // end pipeline diff --git a/src/MousePointer.cpp b/src/MousePointer.cpp index 26e913f..7a68b7a 100644 --- a/src/MousePointer.cpp +++ b/src/MousePointer.cpp @@ -243,3 +243,12 @@ MousePointer::MousePointer() : mode_(Pointer::POINTER_DEFAULT) pointer_[Pointer::POINTER_METRONOME] = new PointerMetronome; } +MousePointer::~MousePointer() +{ + delete pointer_[Pointer::POINTER_DEFAULT]; + delete pointer_[Pointer::POINTER_GRID]; + delete pointer_[Pointer::POINTER_LINEAR]; + delete pointer_[Pointer::POINTER_SPRING]; + delete pointer_[Pointer::POINTER_WIGGLY]; + delete pointer_[Pointer::POINTER_METRONOME]; +} diff --git a/src/MousePointer.h b/src/MousePointer.h index 7bb00d1..121deca 100644 --- a/src/MousePointer.h +++ b/src/MousePointer.h @@ -128,6 +128,7 @@ class MousePointer MousePointer(); MousePointer(MousePointer const& copy) = delete; MousePointer& operator=(MousePointer const& copy) = delete; + ~MousePointer(); public: static MousePointer& manager () diff --git a/src/Scene.cpp b/src/Scene.cpp index cdf432c..6b69be8 100644 --- a/src/Scene.cpp +++ b/src/Scene.cpp @@ -224,18 +224,28 @@ void Primitive::accept(Visitor& v) void Primitive::replaceShader( Shader *newshader ) { - if (newshader) { + // keep ref to previous shader + Shader *previousshader = shader_; + + // apply new shader to Primitive, even if nullptr + shader_ = newshader; + + if (shader_) { + // get new attribs... glm::mat4 iTransform = newshader->iTransform; glm::vec4 color = newshader->color; - if (shader_) { - iTransform = shader_->iTransform; - color = shader_->color; - delete shader_; + // ...or use previous shader attribs, if existed + if (previousshader) { + iTransform = previousshader->iTransform; + color = previousshader->color; + // shader is swapped, previous can be deleted + delete previousshader; } + // Apply attribs shader_->iTransform = iTransform; shader_->color = color; } - shader_ = newshader; + } // diff --git a/src/Settings.cpp b/src/Settings.cpp index f2d10c0..978b3d4 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -423,7 +423,7 @@ void Settings::Load(const string &filename) return; // version - int major, minor, patch; + int major = 0, minor = 0, patch = 0; pRoot->QueryIntAttribute("major", &major); pRoot->QueryIntAttribute("minor", &minor); pRoot->QueryIntAttribute("patch", &patch); diff --git a/src/Stream.cpp b/src/Stream.cpp index 3903389..db81cc3 100644 --- a/src/Stream.cpp +++ b/src/Stream.cpp @@ -382,8 +382,10 @@ void Stream::Frame::unmap() void Stream::pipeline_terminate( GstElement *p ) { #ifdef STREAM_DEBUG - g_printerr("Stream %s close\n", gst_element_get_name(p)); - Log::Info("Stream %s closed", gst_element_get_name(p)); + gchar *name = gst_element_get_name(p); + g_printerr("Stream %s close\n", name); + Log::Info("Stream %s closed", name); + g_free(name); #endif // force flush