I have the following code. Trying to have a shared memory vector with structure having string and arrays. But when i compile the code I am getting error:
us
I've live-coded my review: recorded session
The fixed up code is below. Some of the notes (please watch the streaming session, though):
you failed to give the "shared" string an allocator. That means it uses std::allocator
and the allocations are done from the program heap. OOOPS. Your program will die, if you're lucky.
once you give the shared_string
the proper allocator, you'll find ripple effects. You need to pass in allocator instances at construction of shared_string
because interprocess allocator instances are not default constructible.
Rule Of Thumb: Stateful allocators are painful. If you avoid the pain, you're doing it wrong (and allocating from the wrong heap)
naming is important:
typedef allocator tStructData;
why name your allocator type tStructData
? You might as well call it XXX
. So, change it to
typedef allocator salloc;
This took me while while I was trying to make sense of your code...
Instead of explicitly creating alloc_inst
, considering using the implicit conversion from segment_manager
The line
myvector->push_back(&tData);
tries to push a pointer into a vector of class objects. That can never work, regardless of your allocator(s)
Live On Coliru
#include
#include
#include
#include
#include
#include
#include
using namespace boost::interprocess;
struct InData;
typedef allocator salloc;
typedef boost::interprocess::basic_string, salloc::rebind::other> shared_string;
struct InData {
int X, Y, H, W;
InData(salloc alloc) : Label(alloc) {}
shared_string Label;
};
int main() {
shared_memory_object::remove("MySharedMemory");
managed_shared_memory managed_shm(create_only, "MySharedMemory", 10000);
// Initialize shared memory STL-compatible allocator
salloc alloc_inst(managed_shm.get_segment_manager());
InData tData(alloc_inst); // = managed_shm.construct("InDataStructure")();
tData.Label = "Hello World";
tData.H = 1;
tData.W = 1;
tData.Y = 1;
tData.X = 1;
// Construct a vector named "MyVector" in shared memory with argument alloc_inst
typedef vector MyVector;
MyVector *myvector = managed_shm.construct("MyVector")(alloc_inst);
// InData data;
myvector->push_back(tData);
}