代码之家  ›  专栏  ›  技术社区  ›  recipriversexclusion

在共享内存中使用自定义分配器实例化类

  •  1
  • recipriversexclusion  · 技术社区  · 16 年前

    我拔头发是因为以下问题:我在跟踪 the example 在boost.interprocess文档中给出,用于实例化我在共享内存中编写的固定大小的环形缓冲区缓冲类。我的类的骨架构造函数是:

    template<typename ItemType, class Allocator >
    SharedMemoryBuffer<ItemType, Allocator>::SharedMemoryBuffer( unsigned long capacity ){
    
        m_capacity = capacity;
    
        // Create the buffer nodes.
        m_start_ptr = this->allocator->allocate();  // allocate first buffer node
        BufferNode* ptr = m_start_ptr;
        for( int i = 0 ; i < this->capacity()-1; i++ ) {
            BufferNode* p = this->allocator->allocate();    // allocate a buffer node
        }
    }
    

    我的第一个问题:这种分配是否保证缓冲区节点被分配到相邻的内存位置,即当我试图从地址访问第n个节点时 m_start_ptr + n*sizeof(BufferNode) 在我的 Read() 方法有用吗?如果没有,还有什么更好的方法来保存节点,创建链接列表?

    我的测试线束如下:

    // 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;
    
    //Alias a vector that uses the previous STL-like allocator so that allocates
    //its values from the segment
    typedef SharedMemoryBuffer<int, ShmemAllocator> MyBuf;
    
    int main(int argc, char *argv[]) 
    {
        shared_memory_object::remove("MySharedMemory");
    
        //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 buffer named "MyBuffer" in shared memory with argument alloc_inst
        MyBuf *pBuf = segment.construct<MyBuf>("MyBuffer")(100, alloc_inst);
    }
    

    这将给出与最后一条语句的模板相关的所有编译错误。我做错什么了?是 segment.construct<MyBuf>("MyBuffer")(100, alloc_inst) 提供这两个模板参数的正确方法是什么?

    1 回复  |  直到 16 年前
        1
  •  1
  •   dirkgently    16 年前

    我的第一个问题是:这种 分配保证缓冲区 节点以连续的方式分配 记忆位置,即当我试图 从地址访问第n个节点 m_start_ptr+n*sizeof(buffernode)输入 我的read()方法行吗?

    不。原因是你只有第一个节点。所有 BufferNode 您创建的对象不会被保存(例如,以链表方式)并导致内存泄漏。此外,这种分配方式不保证连续的内存位置。随机访问(如您稍后在问题中所述)很可能会失败。要获得连续内存,需要创建 缓冲节点 物体。

    这将给出与最后一条语句的模板相关的所有编译错误。我做错什么了?

    不知道实际的错误很难说。此外,您是否理解您的代码(以及如何 Boost::Interprocess 是否适合或分配器如何工作?

    请注意,您引用的示例创建了 vector 它被保证为它所包含的对象有连续的内存。这里唯一的区别是,对象是在共享内存段上创建的,而不是在空闲存储区上创建的,当您不将分配器指定为第二个参数并且使用默认参数时,通常会发生这种情况。