Hello,
I'm currently trying to store shared_ptr to data in a vector in
fixed_managed_shared_memory.
The problem is that my program is crashing during a weak_ptr assignment.
Since the problem is difficult to explain, I designed a little example
which crash every time for me :
#include <iostream>
#include <algorithm>
#include
#include
#include
#include
#include
using namespace boost::interprocess;
struct Foo
{
Foo( int _x ) : x(_x) {}
~Foo() { std::cout << "Destructing a Foo with x=" << x << "\n"; }
int x;
/* ... */
};
typedef managed_shared_ptr::type FooSharedPtrType;
typedef managed_weak_ptr ::type FooWeakPtrType;
typedef allocator FooWeakPtrAllocatorType;
typedef vector
FooWeakPtrVectorType;
struct FooPtrOps
{
void operator()( const FooWeakPtrType & a )
{ std::cout << a.lock()->x << "\n"; }
};
int main()
{
//Remove existing segment
shared_memory_object::remove("MySharedMemory");
//Create a new segment with given name and size
fixed_managed_shared_memory segment(create_only, "MySharedMemory", 65536);
//Initialize shared memory STL-compatible allocator
const FooWeakPtrAllocatorType alloc_inst (segment.get_segment_manager());
//Construct a vector named "MyVector" in shared memory with
argument alloc_inst
FooWeakPtrVectorType *foo_vector =
segment.construct<FooWeakPtrVectorType>("MyVector")(alloc_inst);
FooSharedPtrType foo_ptr =
make_managed_shared_ptr(segment.construct<Foo>(anonymous_instance)(2),
segment);
foo_vector->reserve(1);
(*foo_vector)[0] = foo_ptr;
foo_vector->reserve(2);
(*foo_vector)[1] = foo_ptr;
foo_vector->reserve(3);
(*foo_vector)[2] = foo_ptr;
std::cout << "foo_vector:\n";
std::for_each( foo_vector->begin(), foo_vector->end(), FooPtrOps() );
}
The crash occurs during the last assignment.
Investigating using gdb it seems that just before the assignment the
value of (*foo_vector)[2] is :
{m_pn = {m_px = 0x0, m_pi = 0x4000000000000fe2}}
Obviously the m_pi address is wrong which cause the crash.
I think it should be 0x0 like m_px.
So, did I do something wrong or did I find a bug ?
Thanks for your help.
Gaƫtan.