【发布时间】:2018-01-31 02:52:12
【问题描述】:
我有两个相同的二进制文件在 Linux 系统上同时运行(不同的命令行参数,所以它们做不同的事情)。在一个进程中,我将一个对象 memcopy 到某个共享内存区域;在另一个过程中,我检索具有正确大小的对象,并以void* 的形式获取指向它的指针,并将static_cast 指向原始类型的指针。
这被认为是安全的吗?对象不一定是 POD。
【问题讨论】:
-
你永远不应该使用
void* -
@JakeFreeman 这有点夸张,在处理原始内存时 void* 很常见。
malloc、memcpy等 -
实际上,是的,只要类没有指向内部数据成员、引用或虚拟的指针,Folly 就会实现这一点。在纯理论中,没有。 Folly、Bloimberg 和 EASTL 都有自己的类型重定位版本,以避免移动构造函数,这些构造函数基本上都在一定程度上涉及非平凡类型的 memcpy。
-
@NirFriedman 通常用于 C++,您永远不需要直接使用
void* -
使用
void*通常是不可避免的,因为低级(OS)API。但是,在 C++ 中,您会将这些接口包装在类型安全的 C++ 接口中。这会将void*的使用本地化到一个地方(通常是一个类),因此您的大部分应用程序不会受到影响。
标签: c++ ipc type-safety static-cast memory-safety