2013-10-09 128 views
0

我正在创建一个简单的(ish)telnet服务器,现在正在使用valgrind进行调试。代码运行很好,但Valgrind的抱怨内存在程序结束时,会丢失......而罪魁祸首就是我创建一个新的与QTcpSocket行:Qt/C++ QTcpSocket导致内存泄漏,不知道为什么

void TelnetConnection::run() 
{ 
    tcpSocketPtr = new QTcpSocket(); // ** remove this due to parent error 
    if (!tcpSocketPtr->setSocketDescriptor(socketDescriptor)) { 
     emit error(tcpSocketPtr->error()); 
     return; 
    } 
} 

我试图通过“这个”到与QTcpSocket(),但那么我尝试连接的信号插槽会抱怨与不同的父母关联。这是问题吗?线索?而...答案是什么?


我按照下面的方式为它指定一个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 
} 
+2

你在哪里删除'tcpSocketPtr'? –

+0

我展示了客户端断开连接时调用的代码......并且希望释放为套接字分配的内存。它是否正确? – TSG

+3

你不需要'删除'tcpSocketPtr指向的内存区域,只需清除指针(不需要对内存区域和'QTcpSocket'对象进行任何操作!)。 –

回答

7

对于每次调用“新”时,都必须调用“删除”。正如评论所暗示的那样,您将指针指向0,但从不调用delete。

编辑添加YT视频的一个很好的解释的概念:http://www.youtube.com/watch?v=_749lj2yb8Y实质上,你永远不会释放你从CPU请求的内存,因此你内存泄漏。简单的删除电话将解决这个问题。

+1

哇 - 我的错误的假设...我认为C++有一个堆管理器,在我之后清理。我将不得不使用删除。谢谢。 – TSG