C++ 为什么我的消息大小在退出循环后随机变化?

问题描述 投票:0回答:1

我正在使用 zmq 发送消息,并且在我的函数中,当我退出循环时,由于某种原因接受响应,第 8 个值似乎总是飙升至一个疯狂的高随机数。

我尝试使用计数来查看值的变化。当我在将其推入消息后检查部分的大小(并将其与循环内的向量进行比较)时,它似乎正常并且所有值都是预期的,但是一旦它退出 do while 循环,我就会迭代消息向量仅更改第 8 个值,但对于第 8 个值之后的所有内容都是正确的。我试图确保所有未使用的消息都已关闭,但我不太确定它们会如何改变任何内容。我还检查了发送的消息是否正确,但我很困惑。

    int more;
    size_t more_size = sizeof(more);
    std::vector<zmq_msg_t> messages;
    int counter = 0;
    do {
      zmq_msg_t part;
      rc = zmq_msg_init(&part);
      rc = zmq_msg_init_size(&part, CHUNK_SIZE);
      /* Block until a message is available to be received from socket */
      rc = zmq_msg_recv(&part, clientSocket_, 0);
      assert(rc != -1);

      // Add the string to the vector
      messages.push_back(part);
      /* Determine if more message parts are to follow */
      rc = zmq_getsockopt(clientSocket_, ZMQ_RCVMORE, &more, &more_size);
      assert(rc == 0);
      zmq_msg_close(&part);
    } while (more);

    for (zmq_msg_t msg : messages) {
      std::cout << "message size: " << zmq_msg_size(&msg) << std::endl;
    }

输出如下。

message size: 1024
message size: 1024
message size: 1024
message size: 1024
message size: 1024
message size: 1024
message size: 1024
message size: 139644284960912
message size: 1024
... (keeps going)
c++ zeromq
1个回答
0
投票

这只是一个包装类的简单草图——我还没有尝试过,因为我什至没有可用的库。您应该仍然能够理解这个想法,并可能修复无法按预期工作的问题。

class MyZmsg
{
public:
   std::unique_ptr<zmq_msg_t> message;

public:
   MyZmsg()
   {
      auto msg=std::make_unique<zmq_msg_t>();
      if (zmq_msg_init(msg.get())!=0) throw std::bad_alloc();
      message=std::move(msg);
   }

   ~MyZmsg()
   {
      if (message) zmq_msg_close(message.get());
   }

   operator zmq_msg_t*() const noexcept
   {
      return message.get();
   }
};

这应该是可移动的,但不可复制(因为

unique_ptr
),因此您可以将其粘贴到
vector
中。它已经为您完成了初始化/关闭操作,并且转换运算符应该允许您仅使用此实例而不是
&part

© www.soinside.com 2019 - 2024. All rights reserved.