Pack Class Object指针指向消息队列的char *

时间:2011-10-21 21:28:19

标签: c++ linux message-queue reinterpret-cast static-cast

是否可以通过POSIX消息队列正确安全地传递类对象指针?

例如,

Object *obj = new Object();

mq_send(mqdes, static_cast<char*>&obj, sizeof(obj), 1);

在接收方,执行reinterpret_castObject

由于消息队列在Linux上使用文件描述符,我很好奇这是如何工作的。我尝试过但没有成功,但我认为我可能做错了。

1 个答案:

答案 0 :(得分:3)

不是......仅当对象仅包含基本类型字段和其他具有基本类型字段的结构时。如果您发送指针,如果它位于另一个进程或另一个系统中,则无法从另一方重用它。

同样使用具有继承和虚方法的类,它可能是一团糟!

从我的角度来看,最好添加一种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 *)...你只需要发送指针,而不是对象本身。