3

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

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

4

1 回答 1

3

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

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

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

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

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

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

于 2010-03-17T04:20:59.690 回答