C ++ BOOST:Windows共享内存get_size()返回零

Posted

技术标签:

【中文标题】C ++ BOOST:Windows共享内存get_size()返回零【英文标题】:C++ BOOST: windows shared memory get_size() returns zero 【发布时间】:2010-07-29 18:07:58 【问题描述】:

以下内容来自官方 BOOST 文档。 为什么我在调用 region.get_size() 时总是得到零大小?我做错了什么?

int main(int argc, char *argv[])


  //Create a native windows shared memory object.
  windows_shared_memory shm (create_only, "MySharedMemory", read_write, 1000);

  //Map the whole shared memory in this process
  mapped_region region(shm, read_write);
  cout << "SIZE IS " << region.get_size() << endl;

return 0;

【问题讨论】:

【参考方案1】:

我想我得到了答案: 来自 boost 文档:

本机 windows 共享内存也有 另一个限制:进程可以打开 并映射整个共享内存 由另一个进程创建,但它 不知道哪个是那个大小 记忆。这个限制是由 Windows API,因此用户必须 以某种方式传输的大小 段到进程打开 段。

【讨论】:

【参考方案2】:

在 boost::interprocess documentation 的 mapped_region 构造函数中,您正在使用它:

创建映射的映射区域 内存“映射”,从偏移量开始 "offset", 和映射的大小将 是“大小”。可以打开映射 对于只读“read_only”或 读写“read_write.

所以提供一个非零大小,一切都会按预期工作: mapped_region region(shm, read_write, 0, 1000);

【讨论】:

不根据文档。 windows 中不应调用具有大小的 mapped_region。看我上面的回答

以上是关于C ++ BOOST:Windows共享内存get_size()返回零的主要内容,如果未能解决你的问题,请参考以下文章

c++ boost进程间交换(复制)非共享和共享字符串向量

Windows 进程和 WSL Linux 进程之间的共享内存

boost的问题:进程间共享内存

提升进程间共享内存删除对象而不破坏

boost::interprocess 32 位和 64 位进程之间的共享内存

boost::interprocess 不在共享内存副本中的容器容器