2013-10-09 3 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(), но то сигнальные слоты, которые я пытаюсь подключить, жалуются на то, что связаны с другим родителем. Это проблема? Ключ? И ... каков будет ответ?

Я удаляю/освобождаю tcpsocketptr, присваивая ему значение 0, как показано ниже. Это правильно?

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

Wow - большое ошибочное предположение с моей стороны ... Я думал, что C++ имел кучного менеджера, который убирался за мной. Мне нужно будет использовать delete. Благодарю. – TSG

Смежные вопросы