2013-10-09 3 views
0

Я бегу Valgrind на моей программе Qt/C++, и я получаю эту ошибку:Qt/C++/Valgrind Invalid Readsize 8 на QTcpSocket разъединение

Invalid read of size 8 
    in TelnetConnection::disconnectClient() in telnetserver/telnetconnection.cpp:188 

и линия 188 является линией waitForDisconnected ниже:

void TelnetConnection::disconnectClient() 
{ 
    tcpSocketPtr->disconnectFromHost(); 
    tcpSocketPtr->waitForDisconnected(); 
} 

Я не совсем уверен, что означает эта ошибка, но как я могу это исправить? Или это из-под контроля? (вопрос Qt)?

Я не уверен, что это связано, но только другая ошибка, я получаю:

384 bytes in 1 blocks are possibly lost in loss record 5,342 of 5,972 
    in TelnetServer::incomingConnection(long long) in telnetserver/telnetserver.cpp:22 

и линия ошибки Start() ниже:

void TelnetServer::incomingConnection(qintptr socketDescriptor) 
{ 
    TelnetConnection *thread = new TelnetConnection(socketDescriptor, this); 
    connect(thread, SIGNAL(shutdownRequested()), m_controller, SLOT(shutdownCommandIssued())); 
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
    connect(m_controller, SIGNAL(shutingdown()), thread, SLOT(shutdownConnection())); 
    thread->start(); 
} 

снова .. . Как может эта функция запуска вызвать утечку памяти? Или слова «возможно потерянные» означают, что на самом деле все в порядке?

+0

Я еще не видел эту ошибку для '' -> start() '', но выглядит так, как вы делали подкласс QThread. Это не самый предпочтительный способ в большинстве случаев. В конце концов ваше подклассирование должно что-то сделать со вторым сообщением. На самом деле это похоже на то, что valgrind сводит весь поток-подкласс к '' thread-> start() ''. Слова «возможно потерянные» означают, что вы в конечном итоге получили утечку. Первое сообщение просто сообщает вам, что ваше приложение попыталось прочитать из недопустимого адреса памяти. Это происходит, когда '' waitforDisconnected() '' проверяет, действительно ли соединение по-прежнему действует, но память подключения уже освобождена. –

+0

Чтобы исправить первое сообщение, должен ли я сначала проверить isOpen на сокете, и только если истинный вызов waitforDisconnected? (Или есть «правильное» ожидание, чтобы этого избежать). Я не понимаю, что вы имеете в виду «сделать что-то со вторым сообщением» ... как я могу это исправить? – TSG

+3

Подклассификация QThread должна выполняться только с помощью одного линейного длинного командного блока (например, обработки изображений). Как только вам понадобятся события/сигналы/слоты, условия ожидания, мьютексы, циклы и т. Д., Вам необходимо создать объект и перенести его на не-подклассу QThread (использовать соединения с сигналом/слотом) или использовать QtConcurrent. НО это, вероятно, не решит вашу (возможную) утечку, это просто хороший способ работы с потоками. Не сказано, что должна быть утечка, а именно, что valgrind не может найти информацию о недостающих блоках. –

ответ

0

См. Комментарии sebastian выше для получения наилучшего ответа. В основном ошибка чтения/записи связана с продолжающимся трафиком сокета даже после закрытия сокета (закрытие не останавливает весь трафик). Решение заключается в удалении сокета при удалении потока.

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