Note that there are some explanatory texts on larger screens.

plurals
  1. POMemory Leak During Push In A Queue
    primarykey
    data
    text
    <p>I been working in a project for my Data Networks course and I encounter a memory leak but I don't understand why it's happening.</p> <p>By the way, I know there is a awful mix of C and C++, but I can't do anything about it, it's based on class code and I can't modified that, I know that this is not a good way to do it and I need to use char* as requisite.</p> <p>My program it's multithreaded and I handle this struct:</p> <pre><code>typedef struct packetQueue { char* buf; int length; packetQueue() { buf = nullptr; length = 0; } packetQueue(char* buffer, int len) { length = len; buf = new char[length + 1]; memcpy(buf, buffer, len); buf[length] = '\0'; } packetQueue(const packetQueue&amp; other) { length = other.length; if (other.buf) { buf = new char[length + 1]; memcpy(buf, other.buf, length); buf[length] = '\0'; } else { buf = nullptr; } } packetQueue&amp; operator=(const packetQueue&amp; that) { if (this == &amp;that) { return *this; } delete[] buf; length = that.length; if (that.buf) { buf = new char[length + 1]; memcpy(buf, that.buf, length); buf[length] = '\0'; } else { buf = nullptr; } return *this; } ~packetQueue() { delete[] buf; buf = nullptr; } } PACKET; </code></pre> <p>In my constructor with two parameters I do that assignment because the push of my queue does a deep copy of my struct and like I have my copy constructor and I already handled that. So, I have one thread (I been testing one by one, and the VLD results are just for this one).</p> <pre><code>DWORD _stdcall PHY_in_Thread(void* data) { int numbytes, counter = 0; SOCKET hostSocket = *(SOCKET*) data; // Socket where the host receives struct sockaddr_in si_recvfrom; struct sockaddr_storage their_addr; socklen_t addr_len; addr_len = sizeof their_addr; while ( 1 ) { char* recBuf = new char[BUFLEN + 1]; // Checks if it's any buffer on the socket to be processed if ( (numbytes = recvfrom(hostSocket, recBuf, BUFLEN, 0, (sockaddr*) &amp;si_recvfrom, &amp;addr_len)) == -1) { cerr &lt;&lt; "Could not receive datagram." &lt;&lt; endl; delete[] recBuf; closesocket(hostSocket); WSACleanup(); exit(0); } recBuf[numbytes] = '\0'; // append NULL to the end of the string char* temporalBuffer = new char[numbytes - CHECKSUM_MAX_SIZE + 1]; memcpy(temporalBuffer, recBuf, numbytes - CHECKSUM_MAX_SIZE); temporalBuffer[numbytes - CHECKSUM_MAX_SIZE] = '\0'; char extractedChecksum[CHECKSUM_HEX_SIZE + 1]; DWORD crcBuffer = crc32buf(temporalBuffer, numbytes- CHECKSUM_MAX_SIZE); // Calculates the CRC32 checksum _snprintf(extractedChecksum, 8 , "%08lX", crcBuffer); // Prints the string in a buffer extractedChecksum[CHECKSUM_HEX_SIZE] = '\0'; delete[] temporalBuffer; string strExtractedChecksum = extractedChecksum; // Copies the array in a string transform(strExtractedChecksum.begin(), strExtractedChecksum.end(), strExtractedChecksum.begin(), upper); // Uppercase the string // Array for store the checksum of the packet char readChecksum[CHECKSUM_MAX_SIZE + 1]; // Store the checksum of the packet in local variable memcpy( readChecksum, &amp;recBuf[numbytes - CHECKSUM_MAX_SIZE], CHECKSUM_MAX_SIZE); readChecksum[CHECKSUM_MAX_SIZE] = '\0'; std::stringstream stream; string strReadChecksum; for (int i = 0; i &lt; CHECKSUM_MAX_SIZE; i++ ) { int number = static_cast&lt;int&gt;(readChecksum[i]); // Casts every character of the checksum array if ( readChecksum[i] &lt;= -1 ) // In case the int value it's negative adds the constant value to make that recognizable { number += 256; } // Convert the decimal number in a hex representation stream.str(""); stream &lt;&lt; hex &lt;&lt; number; if ( stream.str().length() &lt; 2 ) // In case it's a number less than 10, adds a 0 at the beginning { strReadChecksum += "0" + stream.str(); } else { // Working out the presentation of the number strReadChecksum += stream.str(); } } std::transform(strReadChecksum.begin(), strReadChecksum.end(), strReadChecksum.begin(), upper); // Uppercase the string strReadChecksum[CHECKSUM_HEX_SIZE] = '\0'; cout &lt;&lt; "[PI] Frame #" &lt;&lt; counter &lt;&lt;" received ("&lt;&lt; numbytes &lt;&lt;" bytes). " &lt;&lt; endl; if ( !strcmp(strReadChecksum.c_str(), extractedChecksum) ) // Checks if the CRC are equal { cout &lt;&lt; "[CRC] Checksum OK: 0x" &lt;&lt; extractedChecksum &lt;&lt; endl; } else { cout &lt;&lt; "[CRC] Checksum failure: 0x" &lt;&lt; extractedChecksum &lt;&lt; endl; } // Push the packet in the MAC_in_queue to be processed MAC_in_queue.push(PACKET(recBuf, numbytes)); recBuf = nullptr; counter++; break; // Just for test one packet } MAC_in_queue.clear(); return 0; </code></pre> <p>}</p> <p>But when I execute this thread and send something to this thread to be stored in this queue gives a leak. In this execution there is only one item to make things simple.</p> <pre><code>---------- Block 29 at 0x0068F718: 264 bytes ---------- Call Stack: d:\program files (x86)\microsoft visual studio 11.0\vc\include\concurrent_queue.h (402): Host.exe!Concurrency::concurrent_queue&lt;packetQueue,std::allocator&lt;packetQueue&gt; &gt;::_Allocate_page + 0xF bytes f:\dd\vctools\crt_bld\self_x86\crt\src\concurrent_queue.cpp (113): MSVCP110D.dll!Concurrency::details::_Micro_queue::_Push + 0xD bytes f:\dd\vctools\crt_bld\self_x86\crt\src\concurrent_queue.cpp (240): MSVCP110D.dll!Concurrency::details::_Concurrent_queue_base_v4::_Internal_move_push d:\program files (x86)\microsoft visual studio 11.0\vc\include\concurrent_queue.h (581): Host.exe!Concurrency::concurrent_queue&lt;packetQueue,std::allocator&lt;packetQueue&gt; &gt;::push + 0xF bytes d:\users\silex rpr\documents\visual studio 2012\projects\project3\hoster\host.cpp (638): Host.exe!PHY_in_Thread + 0x3D bytes 0x7474339A (File and line number not available): kernel32.dll!BaseThreadInitThunk + 0x12 bytes 0x76EC9EF2 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x63 bytes 0x76EC9EC5 (File and line number not available): ntdll.dll!RtlInitializeExceptionChain + 0x36 bytes Data: 00 00 00 00 01 00 00 00 60 F8 68 00 80 00 00 00 ........ `.h..... CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD ........ ........ </code></pre> <p>But I don't understand where it's this data leaking, I hope I made myself clear.</p> <p>Thanks beforehand</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload