How to pass parameters to manage_shared_memory.construct() in Boost.Interprocess
I've stared at the Boost.Interprocess documentation for hours but still haven't been able to figure this out. In the doc, they have an example of creating a vector in shared memory like so:
//Define an STL compatible allocator of ints that allocates from the managed_shared_memory.
//This allocator will allow placing containers in the segment
typedef allocator<int, managed_shared_memory::segment_manager> ShmemAllocator;
//A开发者_C百科lias a vector that uses the previous STL-like allocator so that allocates
//its values from the segment
typedef vector<int, ShmemAllocator> MyVector;
int main(int argc, char *argv[])
{
//Create a new segment with given name and size
managed_shared_memory segment(create_only, "MySharedMemory", 65536);
//Initialize shared memory STL-compatible allocator
const ShmemAllocator alloc_inst (segment.get_segment_manager());
//Construct a vector named "MyVector" in shared memory with argument alloc_inst
MyVector *myvector = segment.construct<MyVector>("MyVector")(alloc_inst);
Now, I understand this. What I'm stuck is how to pass a second parameter to segment.construct()
to specify the number of elements. The interprocess document gives the prototype for construct()
as
MyType *ptr = managed_memory_segment.construct<MyType>("Name") (par1, par2...);
but when I try
MyVector *myvector = segment.construct<MyVector>("MyVector")(100, alloc_inst);
I get compilation errors.
My questions are:
- Who actually gets passed the parameters
par1, par2
fromsegment.construct
, the constructor of the object, e.g.vector
? My understanding is that the template allocator parameter is being passed. Is that correct? - How can I add another parameter, in addition to
alloc_inst
that is required by the constructor of the object being created in shared memory?
There's very little information other than the terse Boost docs on this.
I asked the same question on the boost users mailing list and Steven Watanabe replied that the problem was simple: std::vector does not have a constructor of the type (size, allocator). Looking at its documentation I see that the constructor is
vector ( size_type n, const T& value= T(), const Allocator& = Allocator() );
so the correct call should be
MyVector *myvector = segment.construct<MyVector>("MyVector")(100, 0, alloc_inst);
Elementary, my dear, Watson, elementary!
精彩评论