Awais
Awais

Reputation: 319

Memory Leak in ZeroMQ Server [Request-Reply Scenario]

I am testing ØMQ to be used in my project. I downloaded latest binaries from here. I am using libzmq-v90-mt-gd-4_0_4.lib as intended project uses C++ tool-set v90. Now I created a sample server as example given in official zero-mq guide and a client code given in the same guide. Server code is:

void zmqServer()
{
    //  Prepare our context and socket
    zmq::context_t context(1);
    zmq::socket_t socket(context, ZMQ_REP);
    socket.bind("tcp://*:5555");
    //int i = 0;
    while (true) {
        zmq::message_t request;

        char buffer[256];
        //  Wait for next request from client
        int size = zmq_recv(socket, buffer, 255, 0);
        if (size == -1) continue;
        if (size > 255) size = 255;
        buffer[size] = 0;
        std::string receivedStr = strdup(buffer);

        std::cout << "Message # " << i << ": " << receivedStr << std::endl;

        //  Do some 'work'
        sleep(1);

        //  Send reply back to client
        zmq::message_t reply(5);
        std::string msg = "Server#" + receivedStr;
        std::cout << "Reply # " << i << ": " << msg << std::endl;
        memcpy(reply.data(), msg.c_str(), msg.length());
        socket.send(reply);
        //i++;
    }
}

Client code is:

    void zmqClient()
    {
        //  Prepare our context and socket
        zmq::context_t context(1);
        zmq::socket_t socket(context, ZMQ_REQ);

        std::cout << "Connecting to hello world server..." << std::endl;
        socket.connect("tcp://localhost:5555");

        //  Do 10 requests, waiting each time for a response
        for (int request_nbr = 0; request_nbr != 10; request_nbr/*++ removed to loop forever to test*/) {
            std::string msg = "HELLO FROM CLIENT";
            zmq::message_t request(msg.length());
            memcpy(request.data(), msg.c_str(), msg.length());
            std::cout << "Sending Request#: " << request_nbr << "\nMessage: " << msg << std::endl;
            socket.send(request);

            //  Get the reply.
            zmq::message_t reply;
            socket.recv(&reply);
            std::cout << "Received World " << request_nbr << std::endl;
        }
    }

On server side, windows diagnostic tool (vs-2015) snapshot at a time is:

windows diagnostic tool at 15:11

Another snapshot at a later time is:

windows diagnostic tool at 22:06

One can see the memory difference between both times. About another run, after 20 connections of server program, Visual Leak Detector report is:

WARNING: Visual Leak Detector detected memory leaks!
---------- Block 7 at 0x0171DFE8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 10 at 0x0171E0E8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 17 at 0x0171E128: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 19 at 0x0171E1A8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 13 at 0x0171E228: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 14 at 0x0171E2E8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 1 at 0x0171E368: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 6 at 0x0171E3A8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 15 at 0x0171E3E8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 16 at 0x0171E428: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 20 at 0x0171E468: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 4 at 0x0171E4E8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 11 at 0x0171E528: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 2 at 0x0171E5A8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 5 at 0x0171E5E8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 12 at 0x0171E628: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 18 at 0x0171E668: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 3 at 0x0171E6E8: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 8 at 0x0171E728: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


---------- Block 9 at 0x0171E768: 18 bytes ----------
  Leak Hash: 0x90285749, Count: 1, Total 18 bytes
  Call Stack (TID 5340):
    MSVCR90D.dll!strdup()
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (46): ZeroMQServer.exe!zmqServer() + 0xF bytes
    c:\users\awais\documents\visual studio 2015\projects\zeromqserver\zeromqserver\zmq_server.cpp (20): ZeroMQServer.exe!main()
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (582): ZeroMQServer.exe!__tmainCRTStartup() + 0x19 bytes
    f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c (399): ZeroMQServer.exe!mainCRTStartup()
    KERNEL32.DLL!BaseThreadInitThunk() + 0x24 bytes
    ntdll.dll!__RtlUserThreadStart() + 0x2F bytes
    ntdll.dll!_RtlUserThreadStart() + 0x1B bytes
  Data:
    48 45 4C 4C    4F 20 46 52    4F 4D 20 43    4C 49 45 4E     HELLO.FR OM.CLIEN
    54 00                                                        T....... ........


Visual Leak Detector detected 20 memory leaks (1080 bytes).
Largest number used: 1080 bytes.
Total allocations: 1080 bytes.
Visual Leak Detector is now exiting.

One can see there's a memory leak at every connection. Any suggestions who is the culprit in this scenario? Is memcpy() fishy one or something else like I found a discussion about zero-mq memory leak. Any suggestions to overcome this situation would be highly appreciated.

Edit:

memcpy() is also being used on client side but no memory leak is reported by Visual Leak Detector.

Upvotes: 1

Views: 646

Answers (1)

Awais
Awais

Reputation: 319

Found the culprit. This line:

std::string receivedStr = strdup(buffer);

strdup() allocates memory and return its reference as answer of this question states & another from the man page. I was supposed to do it this way:

char* receivedStr = strdup(buffer);
// use receivedStr
free(receivedStr);

I used strdup() first time today. A newbie's trivial mistake though.

Upvotes: 1

Related Questions