【发布时间】:2010-11-13 23:41:09
【问题描述】:
我必须使用 SysV 消息队列为大学项目发送和接收动态数据。
数据的长度在单独的消息中传输,因此size 是已知的。
这就是我尝试接收数据的方式。我不得不承认我不是 C++ 专家,尤其是在内存分配方面。
罢工>
struct {
long mtype;
char *mdata;
} msg;
msg.mdata = (char *)malloc(size * sizeof(char));
msgrcv(MSGQ_ID, &msg, size, MSG_ID, 0);
问题似乎是malloc 调用,但我不知道如何正确执行此操作。
编辑
我尝试在消息队列周围的 OO 包装器中使用某种 read 方法。我想将消息队列中的数据读入char[] 或std::string。我现在看起来(简化)是这样的。
bool Wrapper::read(char *data, int length)
{
struct Message {
long mtype;
std::string mdata;
};
Message msg;
msg.mdata = std::string(size, '\0');
if(msgrcv(MSGQ_ID, &msg, size, MSG_ID, 0) < 0)
{
return false;
}
memcpy(data, msg.mdata.c_str(), msg.mdata.size());
return true;
}
我得到的只是分段错误或完全损坏的数据(尽管这些数据有时包含我想要的)。
【问题讨论】:
-
在 C++ 中,始终使用 new。永远不要使用 malloc。
-
您说“问题似乎是 malloc 调用”。你为什么这么认为?你得到什么错误/诊断?这是运行时错误,还是编译时错误?需要更多信息。
-
对不起...我遇到分段错误。
-
我刚刚查找了 API - 这一定是有史以来设计最糟糕的 API 之一。既然如此,请忽略我的回答,我已经删除了。
-
你贴的新代码肯定不行。在不调用未定义或实现特定行为的情况下,似乎没有一种在 C++ 中使用 msgrcv() 的好方法。有了这个附带条件,William 的方法就是你能做到的最好。
标签: c++ malloc message-queue