Hi,

Gongyiling_boost wrote:
>Hi,

>Fractal wrote:
>> Hi all
>>     rtree is a great library?I used it in my project, everything is ok except random crash after I updated program bin file.
>>     i dig into the source code of rtree,found the crash was caused by using virtual function at node class. I also found that there is a static version of node class. is this a to be implement feature, or I'm using rtree in the wrong way?
<snip>
here is the minimal example which exhibit the problem, you run the program the first time, is ok, but the second time, it crashed in insert method,
 i'm using vs2012, and the os is win7, in linux version, i observed that only i recompile my program and restart it, will it crash.

Yes, indeed the polymorphic nodes are the cause of this crash. So from now on Boost.Variant-based nodes are used by default in the rtree: https://github.com/boostorg/geometry/commit/3474244d0a91d63752cd8a7b683fd013da030750
The side effects (according to the index/example/benchmark_experimental.cpp) are:
- slower inserts on MSVC
- faster inserts on GCC
- smaller memory consumption
I plan to rewrite and optimize the nodes dispatching in the future when I have more free time, for now the above should do the job.

If you can use the development branch of the library, just get the latest version of Boost or Boost.Geometry from GitHub.

If you need a workaround for a previously released version of Boost you may do exactly the same changes I've made directly in the library or write something like this:

#include <boost/geometry.hpp>
#include <boost/geometry/index/rtree.hpp>


struct my_linear_tag {};

namespace boost { namespace geometry { namespace index { namespace detail { namespace rtree {

template <>
struct options_type<my_linear_tag>
{
    typedef options<
        index::linear<32, 8>,
        insert_default_tag,
        choose_by_content_diff_tag,
        split_default_tag,
        linear_tag,
        node_s_mem_static_tag
    > type;
};

}}}}} // namespace boost::geometry::index::detail::rtree

// ...

typedef bgi::rtree<rtree_value_type, my_linear_tag, indexable_t, equal_to_t, rtree_allocator_t> rtree_t;
 
Let me know if one of the solutions works for you.

Regards,
Adam