我正在尝试在ZeroMQ中初始化一条消息,我可以多次发送,而不必每次都复制内存。
根据the documentation,可以使用zmq_msg_copy
函数(或C ++中的message_t::copy()
)来完成此操作:
#include <cstdio>
#include <zmq.hpp>
using namespace zmq;
int main() {
int payload = 5;
message_t* msg = new message_t((void*)&payload, sizeof(payload));
message_t copy = message_t(sizeof(payload));
// msg->copy(©); // this fails but does not produce an error
int status = zmq_msg_copy((zmq_msg_t*)copy.data(), (zmq_msg_t*)msg->data());
printf("%i\n", status);
}
我用
编译gcc -lzmq -lstdc++ file.cpp
并运行
./a.out
产生
-1
我在这里做错了什么?
源和目标变量:
zmq_msg_copy
有destination first, source second:
int zmq_msg_copy (zmq_msg_t *dest, zmq_msg_t *src);
message_t::copy
按以下方式实施:
inline void copy (message_t const *msg_)
{
int rc = zmq_msg_copy (&msg, const_cast<zmq_msg_t*>(&(msg_->msg)));
if (rc != 0)
throw error_t ();
}
所以@vasek是完全正确的,所提供的参数必须是源。
答案 0 :(得分:2)
根据message_t的文档copy
的参数应该是源消息,而不是目的地。
此代码应该有效(在Slackware 14.2 / GCC6.3和MSVC 2017下测试):
message_t copy;
copy.copy(msg);
另请注意,您不必为复制的邮件预分配邮件缓冲区。