我正在创建一个简单的(ish)telnet服务器,现在正在使用valgrind进行调试。代码运行得很好,但是当程序终止时,valgrind会抱怨内存丢失...而罪魁祸首是我创建一个新QTcpSocket的行:
void TelnetConnection::run()
{
tcpSocketPtr = new QTcpSocket(); // ** remove this due to parent error
if (!tcpSocketPtr->setSocketDescriptor(socketDescriptor)) {
emit error(tcpSocketPtr->error());
return;
}
}
我尝试将'this'传递给QTcpSocket()但是我尝试连接的信号槽抱怨与另一个父关联。这是问题吗?线索?而且......答案是什么?
我通过将tcpsocketptr赋值为0来删除/释放tcpsocketptr,如下所示。是吗?
void TelnetConnection::clientDisconnected()
{
tcpSocketPtr = 0; // ** Cure memory loss?
TelnetConnection::s_clientCount--;
Logger *log = Logger::instance();
log->record(Logger::Information,EVENTID_TELNET_DISCONNECTION,"Telnet client "+QString::number(m_clientNumber) +": Disconnecting");
QThread::quit(); // Exit ths event loop for this thread
}
答案 0 :(得分:7)
每次打电话给“新”时,你必须打电话给“删除”。正如评论所建议的那样,您将指针指向0,但从不调用delete。
编辑添加一个YT视频,对概念进行了很好的解释:http://www.youtube.com/watch?v=_749lj2yb8Y基本上你永远不会释放你从CPU请求的内存,因此内存泄漏。简单的删除调用就可以解决这个问题。