From d0084731255ded7c72d25fbc1bca341860cf48d6 Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Sat, 10 Nov 2012 13:29:07 +0000 Subject: [PATCH] mem leaks related to exceptions fixed in linear redistribute_elements. [SVN r81284] --- .../rtree/linear/redistribute_elements.hpp | 137 ++++++++++-------- .../extensions/index/rtree/node/node.hpp | 23 +++ .../rtree/quadratic/redistribute_elements.hpp | 3 +- .../rtree/rstar/redistribute_elements.hpp | 3 +- .../index/rtree/visitors/insert.hpp | 8 +- 5 files changed, 109 insertions(+), 65 deletions(-) diff --git a/include/boost/geometry/extensions/index/rtree/linear/redistribute_elements.hpp b/include/boost/geometry/extensions/index/rtree/linear/redistribute_elements.hpp index 793f6c222..5e28a2711 100644 --- a/include/boost/geometry/extensions/index/rtree/linear/redistribute_elements.hpp +++ b/include/boost/geometry/extensions/index/rtree/linear/redistribute_elements.hpp @@ -208,7 +208,8 @@ struct redistribute_elements::type elements_type; typedef typename elements_type::value_type element_type; @@ -223,7 +224,7 @@ struct redistribute_elements::apply(elements_copy, allocators); + + throw; // RETHROW + } } }; diff --git a/include/boost/geometry/extensions/index/rtree/node/node.hpp b/include/boost/geometry/extensions/index/rtree/node/node.hpp index a6611fa65..30e5b48e0 100644 --- a/include/boost/geometry/extensions/index/rtree/node/node.hpp +++ b/include/boost/geometry/extensions/index/rtree/node/node.hpp @@ -53,6 +53,29 @@ inline Box elements_box(FwdIter first, FwdIter last, Translator const& tr) return result; } +// destroys stored subtrees if internal node's elements are passed +template +struct destroy_elements +{ + typedef typename Options::parameters_type parameters_type; + + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; + + typedef rtree::node_auto_ptr node_auto_ptr; + + inline static void apply(typename internal_node::elements_type & elements, Allocators & allocators) + { + for ( size_t i = 0 ; i < elements.size() ; ++i ) + { + node_auto_ptr dummy(elements[i].second, allocators); + elements[i].second = 0; + } + } + + inline static void apply(typename leaf::elements_type &, Allocators &) {} +}; + }} // namespace detail::rtree }}} // namespace boost::geometry::index diff --git a/include/boost/geometry/extensions/index/rtree/quadratic/redistribute_elements.hpp b/include/boost/geometry/extensions/index/rtree/quadratic/redistribute_elements.hpp index 22f243eb3..a179389e8 100644 --- a/include/boost/geometry/extensions/index/rtree/quadratic/redistribute_elements.hpp +++ b/include/boost/geometry/extensions/index/rtree/quadratic/redistribute_elements.hpp @@ -94,7 +94,8 @@ struct redistribute_elements::type elements_type; typedef typename elements_type::value_type element_type; diff --git a/include/boost/geometry/extensions/index/rtree/rstar/redistribute_elements.hpp b/include/boost/geometry/extensions/index/rtree/rstar/redistribute_elements.hpp index 0ebaf1d15..0520057a8 100644 --- a/include/boost/geometry/extensions/index/rtree/rstar/redistribute_elements.hpp +++ b/include/boost/geometry/extensions/index/rtree/rstar/redistribute_elements.hpp @@ -334,7 +334,8 @@ struct redistribute_elements::type elements_type; diff --git a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp index 86089aa1c..22f93954a 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/insert.hpp @@ -139,6 +139,12 @@ public: // create reference to the newly created node Node & n2 = rtree::get(*second_node); + // After throwing an exception by redistribute_elements both nodes may be empty. + // The tree won't be valid r-tree. + // The alternative is to create 2 (or more) additional nodes here and store backup info + // in the original node, but then, if exception was thrown, the node would have more than max + // elements which also is not allowed in the r-tree. + // redistribute elements Box box2; redistribute_elements< @@ -148,7 +154,7 @@ public: Box, Allocators, typename Options::redistribute_tag - >::apply(n, n2, n_box, box2, parameters, translator); // MAY THROW + >::apply(n, n2, n_box, box2, parameters, translator, allocators); // MAY THROW // check numbers of elements BOOST_GEOMETRY_INDEX_ASSERT(parameters.get_min_elements() <= rtree::elements(n).size() &&