Shared memory Vectors in boost with

后端 未结 1 1922
温柔的废话
温柔的废话 2021-01-03 16:27

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         


        
1条回答
  •  孤城傲影
    2021-01-03 17:09

    I've live-coded my review: recorded session

    The fixed up code is below. Some of the notes (please watch the streaming session, though):

    1. 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.

    2. 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)

    3. 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...

    4. Instead of explicitly creating alloc_inst, considering using the implicit conversion from segment_manager

    5. 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);
    }
    

    0 讨论(0)
提交回复
热议问题