Я создаю простой (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;
}
}
Я попытался передать "это" в 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
}
Каждый раз, когда вы вызываете "новый", вы ДОЛЖНЫ называть "delete". Как указывали комментарии, вы указываете указатель на 0, но никогда не вызываете delete.
Отредактировано, чтобы добавить YT-видео в хорошее объяснение понятий: http://www.youtube.com/watch?v=_749lj2yb8Y По сути, вы никогда не освобождаете память, которую вы запрашиваете от CPU, следовательно, вы теряете память. Простой вызов для удаления решит это.