Почему zmq_msg_init_data () не освобождает мою выделенную память?

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);
}

И это код клиента:

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);
}

После звонка каждому zmq_msg_init_data, деллокаторы CustomCleanup а также my_free должен быть вызван, чтобы освободить выделенную память, но в моем случае этого не происходит. Зачем?

Примечание: в примере с сервером я использовал как new / malloc, так и указатели string и void, чтобы помочь определить потенциальную ошибку, но она не работает ни в одном случае.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]