C++ 关于C++;共享内存中的容器类

C++ 关于C++;共享内存中的容器类,c++,shared-memory,C++,Shared Memory,我正在围绕boost::interprocess的向量容器编写一个简单的包装器,以便为IPC实现共享内存中的环形缓冲区(shm)。假设buf是在shm中创建的RingBuffer的一个实例。现在,在它的ctor中,buf本身分配了一个私有的boost::进程间::vector数据成员来存储值,例如m_data。我的问题是:我认为m_数据也应该在共享内存中创建。但这是必要的吗 如果在shm本身中创建的buf分配标准内存(即使用new),会发生什么情况。这是否在调用进程的堆上分配?我不认为buf是在

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


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

boost::进程间::vector将分配器类型作为模板参数。此分配器需要从共享内存进行分配(请参见使用示例)

如果您使用
new
类分配内存,则该内存将只能从其分配的进程中访问。这是错误的,这就是为什么
boost::interprocess::vector
需要共享内存分配器的原因

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

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

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


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

谢谢Steve,这消除了我的许多困惑。我剩下的问题是:shm中创建的
buf
类是否应该使用
boost::interprocess::vector
std::vector
来存储其数据?我想它一定是boost版本,只是想知道这是否正确。是的,它必须是进程间的<代码>标准::向量分配内存并存储指向它的指针。默认情况下,它使用
new
进行分配,我们知道这是错误的。但是,即使给
std::vector
一个从共享内存进行分配的分配器,它仍然是错误的,因为共享内存可能不会在所有进程中映射到相同的地址范围,如果不是,指针将无法工作<代码>boost::进程间::vector为您处理这些问题。