For a school project, we need to send large files over the network. For our data, we must use Poco :: XML.
After our files are sent over the network, it seems that the memory is not freed.
Here is an example of the ~9 Mb file in the receiving part:
valgrind --leak-check=full --show-reachable=yes -v ourExecutable parms returns:
12,880,736 bytes in 37 blocks are definitely lost in loss record 101 of 101 at 0x4C2747E: operator new(unsigned long) (vg_replace_malloc.c:261) by 0x5A3AC88: std::string::_Rep::_S_create(unsigned long, unsigned long, std::allocator<char> const&) (in /usr/lib64/gcc/x86_64-pc-linux-gnu/4.4.4/libstdc++.so.6.0.13) by 0x5A3BC4A: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned long) (in /usr/lib64/gcc/x86_64-pc-linux-gnu/4.4.4/libstdc++.so.6.0.13) by 0x5A3C1BB: std::string::reserve(unsigned long) (in /usr/lib64/gcc/x86_64-pc-linux-gnu/4.4.4/libstdc++.so.6.0.13) by 0x5A3C68E: std::string::append(std::string const&) (in /usr/lib64/gcc/x86_64-pc-linux-gnu/4.4.4/libstdc++.so.6.0.13) by 0x5202359: Poco::XML::Element::innerText() const (in /home/tomwij/IGS/trunk/Project/external/lib/libPocoXML.so.8) by 0x4145BF: NodeProtocol::getChildNodeStrValue(Poco::XML::Element*, std::string) (NodeProtocol.cpp:82) by 0x41544F: NodeProtocol::deserialize(std::string const&) (NodeProtocol.cpp:200) by 0x40B088: Node::handleClientPacket(PriorityElement*) (Node.cpp:760) by 0x40A04C: Node::handlePackets() (Node.cpp:574) by 0x4078EA: Node::run() (Node.cpp:162) by 0x40772D: Node::activate() (Node.cpp:138) LEAK SUMMARY: definitely lost: 12,888,036 bytes in 190 blocks indirectly lost: 644,979 bytes in 1,355 blocks possibly lost: 10,089 bytes in 27 blocks still reachable: 306,020 bytes in 43 blocks suppressed: 0 bytes in 0 blocks
Feature that is right in front of Poco
const string NodeProtocol::getChildNodeStrValue(Element * elem, string child) { Element* tempNode = elem->getChildElement(child); XMLString result(tempNode->innerText()); string ret = string(fromXMLString(result)); result.clear(); return ret; }
which causes
XMLString Element::innerText() const { XMLString result; Node* pChild = firstChild(); while (pChild) { result.append(pChild->innerText()); pChild = pChild->nextSibling(); } return result; }
(Note that XMLString is std::string )
Why is append string for STL string memory leak?
If I just assign copy constructors instead of using, this gives the same problem.
EDIT:
I use the latest stable GNU GCC 4.4.4 on Gentoo x64 (linux-2.6.34-gentoo-r12).
Additional functions from the call stack (removed irrelevant large chunks of / if code structures):
Command * NodeProtocol::deserialize(const string & msg) { DOMParser xmlParser;
and
void Node::handleClientPacket(PriorityElement * prio) { Command * command = NodeProtocol::deserialize(prio->fPacket); // CUT: Access some properties of command, let the command execute. delete command; }
and
void Node::handlePackets() { PriorityElement * prio = fQueue->top(); fQueue->pop(); if (prio->fSource == kCLIENT) handleClientPacket(prio); else if (prio->fSource == kNODE) handleNodePacket(prio); delete prio; }
where fQueue :
priority_queue< PriorityElement*, vector<PriorityElement*>, ComparisonFunction >