|
Boost Users : |
Subject: [Boost-users] [Interprocess] Problem with reserve for vector of weak_ptr
From: Gaetan Gaumer (gaetan.gaumer_at_[hidden])
Date: 2010-05-27 12:44:13
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 <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/smart_ptr/shared_ptr.hpp>
#include <boost/interprocess/smart_ptr/weak_ptr.hpp>
#include <boost/interprocess/containers/vector.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
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<Foo,
fixed_managed_shared_memory>::type FooSharedPtrType;
typedef managed_weak_ptr <Foo,
fixed_managed_shared_memory>::type FooWeakPtrType;
typedef allocator<FooWeakPtrType,
fixed_managed_shared_memory::segment_manager> FooWeakPtrAllocatorType;
typedef vector<FooWeakPtrType , FooWeakPtrAllocatorType>
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.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net