I am using boost 1.73.0, and am trying to use circular_buffer together with manage_mapped_file to store strings in a circular buffer persisted on disk.
I do the following to create/open the circular_buffer:
boost::interprocess::managed_mapped_file mmf(boost::interprocess::open_or_create, "./circ_buffer.bin", 10u << 10);
typedef boost::interprocess::allocator<std::string, boost::interprocess::managed_mapped_file::segment_manager> string_allocator;
typedef boost::circular_buffer<std::string, string_allocator> circ_buf;
circ_buf* instance = mmf.find_or_construct<circ_buf>("some_name")(10, mmf.get_segment_manager());
This works well and I can put strings in the circular_buffer like this:
for(int idx = 0 ; idx < 15; idx++) {
std::string v = "mystring1-" + std::to_string(idx);
instance->push_back(v);
}
Looking at the raw file (even though it is binary) I dosee the strings inthere, so it seems like the circular_buffer was indeed persisted.
But, if I try to load the circular_buffer in another process as shown in the first code snippet and read the first element like this:
instance->front()
I get a segmentation fault. I know that in the end I will need sychronization around memory access, but this should not be the problem in the example above as only one process is accessing the file a any given time.
The funny thing is that if I substitute std::string with char in the allocator I do not get the segmentation fault. What am I doing wrong?
Rgds Klaus