共享内存向量在boost中

时间:2015-11-04 20:25:46

标签: boost vector shared-memory

我有以下代码。尝试使用具有字符串和数组的结构的共享内存向量。但是当我编译代码时,我收到了错误:

 usr/local/include/boost/container/vector.hpp:1819:4: error: no matching function for call to ‘InData::InData(InData* const&)’

任何建议如何解决这个问题。我是Boost的新手。

#include <iostream>
#include <string>
#include <cstdlib>
#include <boost/interprocess/ipc/message_queue.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/containers/string.hpp>
#include <boost/interprocess/containers/vector.hpp>

using namespace boost::interprocess;

typedef boost::interprocess::basic_string<char> shared_string;

    struct InData
    {
        int X,Y,H,W;
        shared_string Label;
    };

    int main()
    {

        shared_memory_object::remove("MySharedMemory");
        managed_shared_memory managed_shm(create_only, "MySharedMemory", 10000);

        InData tData;// = managed_shm.construct<InData>("InDataStructure")();

        tData.Label = "Hello World";
        tData.H = 1;
        tData.W = 1;
        tData.Y = 1;
        tData.X = 1;

        typedef allocator<InData,managed_shared_memory::segment_manager> tStructData;
        typedef vector<InData,tStructData>  MyVector;

        //Initialize shared memory STL-compatible allocator
         tStructData alloc_inst (managed_shm.get_segment_manager());

         //Construct a vector named "MyVector" in shared memory with argument alloc_inst
          MyVector *myvector = managed_shm.construct<MyVector>("MyVector")(alloc_inst);

          //InData data;
          myvector->push_back(&tData);

        return 0;
    }

如果只做myvector->push_back(tData)

/usr/local/include/boost/container/detail/advanced_insert_int.hpp:166:10: error: no match for ‘operator=’ (operand types are ‘InData’ and ‘const value_type {aka const InData}’)

1 个答案:

答案 0 :(得分:1)

我已对我的评论进行了实时编码: recorded session

修正后的代码如下。一些笔记(请观看流媒体会话):

  1. 你没有给出&#34;分享&#34;字符串分配器。这意味着它使用std::allocator并且分配是从程序堆完成的。哎呀。如果你很幸运,你的计划将会死亡。

  2. 一旦你给shared_string正确的分配器,你就会发现涟漪效应。您需要在构造shared_string时传入分配器实例,因为进程间分配器实例是可构造的。

      

    经验法则:有状态的分配器很痛苦。如果你避免了痛苦,那么你做错了(并从错误的堆中分配)

  3. 命名很重要:

    typedef allocator<InData, managed_shared_memory::segment_manager> tStructData;
    

    为什么要为您的分配器类型tStructData命名?您也可以称之为XXX。所以,将其改为

    typedef allocator<InData, managed_shared_memory::segment_manager> salloc;
    
      

    当我试图理解你的代码时,这花了我一段时间......

  4. 考虑使用alloc_inst

  5. 的隐式转换,而不是明确创建segment_manager
  6. 该行

    myvector->push_back(&tData);
    

    尝试将指针推送到类对象的向量中。无论你的分配器是什么,这都无法发挥作用

  7. <强> Live On Coliru

    #include <iostream>
    #include <string>
    #include <boost/interprocess/shared_memory_object.hpp>
    #include <boost/interprocess/managed_shared_memory.hpp>
    #include <boost/interprocess/allocators/allocator.hpp>
    #include <boost/interprocess/containers/string.hpp>
    #include <boost/interprocess/containers/vector.hpp>
    
    using namespace boost::interprocess;
    
    struct InData;
    typedef allocator<InData, managed_shared_memory::segment_manager> salloc;
    
    typedef boost::interprocess::basic_string<char, std::char_traits<char>, salloc::rebind<char>::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<InData>("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<InData, salloc> MyVector;
        MyVector *myvector = managed_shm.construct<MyVector>("MyVector")(alloc_inst);
    
        // InData data;
        myvector->push_back(tData);
    }