是否可以通过 POSIX 消息队列正确且安全地传递类对象指针?
例如,
Object *obj = new Object();
mq_send(mqdes, static_cast<char*>&obj, sizeof(obj), 1);
并在接收端,执行reinterpret_cast
回到我的对象
?
由于消息队列在 Linux 上使用文件描述符,我很好奇它是如何工作的。我尝试过但不成功,但我认为我可能做错了什么。
最佳答案
并非如此...仅当对象仅包含基本类型字段和具有基本类型字段的其他结构时。如果您发送一个指针,如果它驻留在另一个进程或另一个系统中,则不能从另一端重用它。
还使用具有继承和虚方法的类,可能会一团糟!
从我的角度来看,最好添加一种 Serialize 方法。
此外,以这种方式传递序列化的结构体二进制文件根本不可移植,并且如果您想在其他系统中使用相同的机制或者更改结构或对象打包等内容,可能会给您带来一些问题。
自定义序列化\反序列化将是首选并且更便携,但选择当然是您的。
类似...
template<typename T>
int SerializeAndSendObject(mqd_t mqdes, const T* instance)
{
MySerializationStream stream;
instance->SerializeTo(stream);
mq_send(stream.toBuffer(), stream.size());
}
如果您只是在两个线程之间发送而不是发送对象的内容,我将只发送指向用 new 分配的对象的指针,然后我将从另一端取消分配它。 请注意,当您处置队列时,您必须首先销毁所有挂起的对象!
Object* pointer = &obj;
mq_send(mqdes, static_cast<char*>(pointer), sizeof(Object*), 1);
注意 sizeof(Object*)...您只需发送指针,而不是对象本身。
关于c++ - 将类对象指针打包成 char * 用于消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855480/