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

Я создаю простой 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
}

person TSG    schedule 09.10.2013    source источник
comment
Где ты delete что tcpSocketPtr ?   -  person Basile Starynkevitch    schedule 09.10.2013
comment
Я показал код, вызываемый при отключении клиента... и где я надеюсь освободить память, выделенную для сокета. Это верно?   -  person TSG    schedule 09.10.2013
comment
Вы не delete указываете зону памяти, на которую указывает tcpSocketPtr, вы просто очищаете указатель (ничего не делая с зоной памяти и объектом QTcpSocket!).   -  person Basile Starynkevitch    schedule 09.10.2013


Ответы (1)


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

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

person It'sPete    schedule 09.10.2013
comment
Вау - большое неправильное предположение с моей стороны ... Я думал, что в С++ есть менеджер кучи, который убирает за мной. Мне придется использовать удаление. Спасибо. - person TSG; 09.10.2013