我在Linux系统上有两个相同的二进制文件同时运行(不同的命令行参数,所以他们做了不同的事情)。在一个过程中,我将一个对象记忆到一些共享内存区域;在另一个过程中,我检索具有正确大小的对象,并获得指向它的指针void*
,并static_cast
指向原始类型的指针。
这被认为是安全的吗?该对象不一定是POD。
答案 0 :(得分:2)
这不安全,因为你无法记忆一个不是非常复杂的对象。例如,您无法通过调用memcopy来移动/复制std::vector
,这可能会导致很多问题。但是,您可以将对象构造到共享内存段中。我强烈建议看一下boost interprocess;即使您不使用它,这些示例也会让您了解可能的情况:http://www.boost.org/doc/libs/1_63_0/doc/html/interprocess/sharedmemorybetweenprocesses.html。
答案 1 :(得分:0)
语言对共享内存没有任何说明,因此从这个意义上讲,问题是无法回答的。在实践中,对可轻易复制的限制是正确的想法;因为允许通过memcpy
给出这样的对象值,所以编译器通常不会进行任何不幸的优化。
您必须注意在不同进程中的不同地址加载的内存。如果对象包含没有指针,则可以忽略它。如果是,您可能需要offset_ptr
。