0

我在 Linux 系统上同时运行了两个相同的二进制文件(不同的命令行参数,所以它们在做不同的事情)。在一个进程中,我将一个对象 memcopy 到某个共享内存区域;在另一个过程中,我检索具有正确大小的对象,并将指向它的指针作为 a void*,并将static_cast它指向原始类型的指针。

这被认为是安全的吗?对象不一定是 POD。

4

2 回答 2

2

这是不安全的,因为你不能 memcpy 一个不是 trivially_copyable 的对象。例如,您不能通过std::vector调用 memcopy 来移动/复制,这可能会导致很多问题。但是,您可以将对象构造到共享内存段中。我强烈建议查看 boost 进程间;即使您不使用它,这些示例也会让您了解可能的情况:http: //www.boost.org/doc/libs/1_63_0/doc/html/interprocess/sharedmemorybetweenprocesses.html

于 2018-01-31T02:57:15.307 回答
0

语言没有提及共享内存,因此从这个意义上说,这个问题是无法回答的。在实践中,对琐碎可复制的限制是正确的想法。由于允许通过 为此类对象赋值memcpy,因此编译器通常不会进行任何不幸的优化。

您必须注意在不同进程中在不同地址加载的内存。如果对象不包含指针,则可以忽略。如果是这样,您可能想要offset_ptr.

于 2018-01-31T03:12:43.043 回答