Qt / C ++ QTcpSocket вызывает утечку памяти, не знаю почему

0

Я создаю простой (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
}
Теги:
qt
memory-leaks
qtcpsocket

1 ответ

7
Лучший ответ

Каждый раз, когда вы вызываете "новый", вы ДОЛЖНЫ называть "delete". Как указывали комментарии, вы указываете указатель на 0, но никогда не вызываете delete.

Отредактировано, чтобы добавить YT-видео в хорошее объяснение понятий: http://www.youtube.com/watch?v=_749lj2yb8Y По сути, вы никогда не освобождаете память, которую вы запрашиваете от CPU, следовательно, вы теряете память. Простой вызов для удаления решит это.

  • 1
    Ух ты - большое неправильное предположение с моей стороны ... Я думал, что в c ++ был менеджер кучи, который вычищал после меня. Я должен использовать удалить. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню