2013-10-09 129 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