我正在围绕boost :: interprocess的向量容器编写一个简单的包装器,以便在IPC的共享内存(shm)中实现环形缓冲区。假设buf
是在shm中创建的RingBuffer
的实例。现在,在其ctor中,buf
本身会分配一个私有boost::interprocess::vector
数据成员来存储值,例如m_data
。我的问题是:我认为m_data
也应该在共享内存中创建。但这是必要的吗?
如果在shm本身创建的buf
分配标准内存,即使用new
,会发生什么。这是否在调用进程的堆上分配?我不认为buf
被分配在那里,那么为什么一个不在进程堆上的对象私有的数据成员在那里被分配。我很困惑。
答案 0 :(得分:3)
boost::interprocess::vector
将分配器类型作为模板参数。此分配器需要从共享内存中分配(请参阅使用示例)。
如果您的类使用new
分配内存,那么该内存只能从分配的进程中访问。这是错误的,这正是boost::interprocess::vector
需要共享内存分配器的原因。< / p>
在它的ctor中,buf本身分配一个私有的boost :: interprocess :: vector数据成员
这对我没有意义。在C ++中,您无法在构造函数中“分配”数据成员。数据成员在类主体中定义,它们是该类的每个对象的一部分。它们与对象在同一个内存中,原因与4字节整数的中间字节在整数相同的内存中的原因相同。
为什么不在进程堆上的对象私有的数据成员在那里被分配
分配内存的方式。如果使用new
进行分配(并且尚未过载),则将其分配到进程内存中。如果您使用共享内存段管理器(我认为Boost称之为它 - 我实际上并没有自己使用这些API)进行分配,它将在共享内存中分配。包含调用的类和存储指向已分配内存的指针的数据成员与它无关。