C++ 为什么zmq_msg_init_data()没有释放我分配的内存?

C++ 为什么zmq_msg_init_data()没有释放我分配的内存?,c++,pointers,zeromq,zero-copy,C++,Pointers,Zeromq,Zero Copy,ZeroMQ提供了一种零拷贝技术,在这种技术中,尽可能避免网络拷贝数据。但是,它似乎不起作用(通过ZeroMQ v4.1.5测试) 这是服务器代码: void CustomCleanup(void *data, void *hint) { cout << "free1" << endl; delete static_cast<std::string*>(hint); } void my_free (void *data, void *hint) {

ZeroMQ提供了一种零拷贝技术,在这种技术中,尽可能避免网络拷贝数据。但是,它似乎不起作用(通过ZeroMQ v4.1.5测试)

这是服务器代码:

void CustomCleanup(void *data, void *hint)
{
  cout << "free1" << endl;
  delete static_cast<std::string*>(hint);
}

void my_free (void *data, void *hint)
{
    cout << "free2" << endl;
    free (data);
}

int main()
{
    //Allocate a string and zero copy it to client
    std::string* messageString = new string("ABCDEFG");
    cout << messageString->c_str() << endl;

    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_PUSH);
    socket.bind ("tcp://*:5555");

    zmq_msg_t msg;
    zmq_msg_init_data (&msg, messageString, messageString->length(), CustomCleanup, messageString);
    zmq_send (socket, &msg, 7, 0);

    cout << messageString->c_str() << endl;

    //Malloc a data buffer and zero copy it to client
    void *data = malloc (6);
    assert (data);
    memcpy (data, "ABCDEF", 6);
    zmq_msg_t msg2;
    int rc = zmq_msg_init_data (&msg2, data, 6, my_free, NULL); assert (rc == 0);

    zmq_send (socket, &msg2, 6, 0);
}
在调用每个zmq_msg_init_数据之后,应该调用deallocators CustomCleanup和my_free来释放分配的内存,但在我的情况下,这不会发生。为什么?


注意:在服务器示例中,我使用new/malloc以及string和void指针来帮助确定潜在的故障,但在这两种情况下都不起作用

发送后是否尝试手动关闭套接字和上下文?我可以想象ZMQ没有时间在服务器端在DeNOMQ C++实例中实际发送消息,套接字和上下文从未显式终止。即使上面的代码在while(true)循环中,也会发生同样的行为,所以我认为这不是一个计时问题。您是否尝试在发送后手动关闭套接字和上下文?我可以想象ZMQ没有时间在服务器端在DeNOMQ C++实例中实际发送消息,套接字和上下文从未显式终止。即使上面的代码在while(true)循环中,同样的行为也会发生,所以我认为这不是时间问题
int main()
{
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_PULL);
    socket.connect ("tcp://127.0.0.1:5555");

    zmq::message_t message;
    socket.recv(&message);
}