关于共享内存中C ++容器类的快速设计问题

时间:2010-03-17 02:44:11

标签: c++ shared-memory

我正在围绕boost :: interprocess的向量容器编写一个简单的包装器,以便在IPC的共享内存(shm)中实现环形缓冲区。假设buf是在shm中创建的RingBuffer的实例。现在,在其ctor中,buf本身会分配一个私有boost::interprocess::vector数据成员来存储值,例如m_data。我的问题是:我认为m_data也应该在共享内存中创建。但这是必要的吗?

如果在shm本身创建的buf分配标准内存,即使用new,会发生什么。这是否在调用进程的堆上分配?我不认为buf被分配在那里,那么为什么一个不在进程堆上的对象私有的数据成员在那里被分配。我很困惑。

1 个答案:

答案 0 :(得分:3)

boost::interprocess::vector将分配器类型作为模板参数。此分配器需要从共享内存中分配(请参阅使用示例)。

如果您的类使用new分配内存,那么该内存只能从分配的进程中访问。这是错误的,这正是boost::interprocess::vector需要共享内存分配器的原因。< / p>

在它的ctor中,buf本身分配一个私有的boost :: interprocess :: vector数据成员

这对我没有意义。在C ++中,您无法在构造函数中“分配”数据成员。数据成员在类主体中定义,它们是该类的每个对象的一部分。它们与对象在同一个内存中,原因与4字节整数的中间字节在整数相同的内存中的原因相同。

为什么不在进程堆上的对象私有的数据成员在那里被分配

分配内存的方式。如果使用new进行分配(并且尚未过载),则将其分配到进程内存中。如果您使用共享内存段管理器(我认为Boost称之为它 - 我实际上并没有自己使用这些API)进行分配,它将在共享内存中分配。包含调用的类和存储指向已分配内存的指针的数据成员与它无关。