
Thanks for answering. Stefan Strasser wrote:
you're right, the BGL uses the default new operator to allocate memory which then isn't collected of course. so this makes it effectively impossible to use BGL with boehm GC. is there a boost guideline to allocate memory only through allocators which is violated here? (the "new" which is causing the leak(or one of your leaks?) in your code is at line 278 of graph/detail/adjacency_list.hpp in version 1.32)
As a matter of facts, by modifying the snippet code and commenting out the add_edge() instruction, the binary no longer leaks, so the guilty "new" is certainly the one you point (which allocate for an edge property). I tried to replace it by "new (UseGC)" in order to check if edge properties become collectable, but unfortunately this does not work, binary still leaks... Snippet code is again provided. -- #include <boost/graph/adjacency_list.hpp> #include <gc/gc_allocator.h> #include <gc/gc_cpp.h> #include <iostream> #include <vector> #include <list> using namespace std; using namespace boost; namespace boost { struct collected_vecS {}; struct collected_listS {}; template <class ValueType> struct container_gen<collected_vecS, ValueType> { typedef vector<ValueType,gc_allocator<ValueType> > type; }; template <class ValueType> struct container_gen<collected_listS, ValueType> { typedef list<ValueType,gc_allocator<ValueType> > type; }; template <> struct parallel_edge_traits<collected_vecS> { typedef allow_parallel_edge_tag type; }; template <> struct parallel_edge_traits<collected_listS> { typedef allow_parallel_edge_tag type; }; namespace detail { template <> struct is_random_access<collected_vecS> { enum { value = true }; typedef true_type type; }; } } typedef adjacency_list<collected_vecS, collected_vecS, directedS, no_property, no_property, no_property, collected_listS> graph; int main() { while(true){ graph * g=new (UseGC) graph; for(unsigned int i=0; i<100; ++i){ add_vertex(*g); } for(unsigned int i=0; i<100; ++i){ for(unsigned int j=0; j<100; ++j){ // if uncommented, leaks // add_edge(i,j,*g); } } } }