From 62cdef33f0c938976f4a051e9413120d92284711 Mon Sep 17 00:00:00 2001 From: badlogic Date: Mon, 13 Apr 2020 11:19:54 +0200 Subject: [PATCH] [cpp] Fix memory leak in SkeletonBounds. Closes #1623. --- .../spine-cpp/include/spine/SkeletonBounds.h | 4 +++- .../spine-cpp/src/spine/SkeletonBounds.cpp | 19 +++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/spine-cpp/spine-cpp/include/spine/SkeletonBounds.h b/spine-cpp/spine-cpp/include/spine/SkeletonBounds.h index c4955e685..eda736257 100644 --- a/spine-cpp/spine-cpp/include/spine/SkeletonBounds.h +++ b/spine-cpp/spine-cpp/include/spine/SkeletonBounds.h @@ -31,6 +31,7 @@ #define Spine_SkeletonBounds_h #include +#include #include namespace spine { @@ -43,6 +44,7 @@ namespace spine { class SP_API SkeletonBounds : public SpineObject { public: SkeletonBounds(); + ~SkeletonBounds(); /// Clears any previous polygons, finds all visible bounding box attachments, /// and computes the world vertices for each bounding box's polygon. @@ -82,7 +84,7 @@ namespace spine { float getHeight(); private: - Vector _polygonPool; + Pool _polygonPool; Vector _boundingBoxes; Vector _polygons; float _minX, _minY, _maxX, _maxY; diff --git a/spine-cpp/spine-cpp/src/spine/SkeletonBounds.cpp b/spine-cpp/spine-cpp/src/spine/SkeletonBounds.cpp index 6e2620f3e..520c323e6 100644 --- a/spine-cpp/spine-cpp/src/spine/SkeletonBounds.cpp +++ b/spine-cpp/spine-cpp/src/spine/SkeletonBounds.cpp @@ -46,13 +46,19 @@ using namespace spine; SkeletonBounds::SkeletonBounds() : _minX(0), _minY(0), _maxX(0), _maxY(0) { } +SkeletonBounds::~SkeletonBounds() { + for (size_t i = 0, n = _polygons.size(); i < n; i++) + _polygonPool.free(_polygons[i]); + _polygons.clear(); +} + void SkeletonBounds::update(Skeleton &skeleton, bool updateAabb) { - Vector &slots = skeleton._slots; + Vector &slots = skeleton.getSlots(); size_t slotCount = slots.size(); _boundingBoxes.clear(); for (size_t i = 0, n = _polygons.size(); i < n; ++i) { - _polygonPool.add(_polygons[i]); + _polygonPool.free(_polygons[i]); } _polygons.clear(); @@ -66,14 +72,7 @@ void SkeletonBounds::update(Skeleton &skeleton, bool updateAabb) { BoundingBoxAttachment *boundingBox = static_cast(attachment); _boundingBoxes.add(boundingBox); - spine::Polygon *polygonP = NULL; - size_t poolCount = _polygonPool.size(); - if (poolCount > 0) { - polygonP = _polygonPool[poolCount - 1]; - _polygonPool.removeAt(poolCount - 1); - } else - polygonP = new(__FILE__, __LINE__) Polygon(); - + spine::Polygon *polygonP = _polygonPool.obtain(); _polygons.add(polygonP); Polygon &polygon = *polygonP;