2013-10-09 3 views
0
내 Qt는/C++ 프로그램에서 내가 Valgrind의를 실행 해요

이 오류가 무엇입니까 :Qt는/C++/Valgrind의 잘못된 Readsize

:

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

라인 (188) 아래의 waitForDisconnected 라인입니다

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

이 오류의 의미를 확실히 알 수는 없지만 어떻게 해결할 수 있습니까? 아니면 제 통제에서 벗어 났습니까? (Qt 문제)? 다시

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(); 
} 

.. : 아래)

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 

및 오류 라인 시작 (이다 :

나는이 관련이 있는지 모르겠지만, 내가 갖는 유일한 다른 오류입니다 .이 함수가 메모리 누수를 일으키는 원인은 무엇입니까? 아니면 "아마도 잃어버린"이라는 말은 실제로 괜찮 았음을 의미합니까?

+0

아직''-> start()''에서이 오류를 보지 못했지만 QThread를 서브 클래스로 만들었던 것처럼 보입니다. 대부분의 경우 선호하지 않습니다. 결국 서브 클래 싱은 두 번째 메시지로 무언가를해야합니다. 사실 valgrind가 전체 스레드 하위 클래스를''thread-> start()''로 줄이는 것처럼 보입니다. "아마도 잃어버린"이라는 말은 결국 누설이 있다는 뜻입니다. 첫 번째 메시지는 앱이 잘못된 메모리 주소에서 읽으려고했음을 알려줍니다. 이것은 결국''waitforDisconnected()''가 연결이 여전히 유효한지를 검사하지만 연결 메모리가 이미 해제되었을 때 발생합니다. –

+0

첫 번째 메시지를 수정하려면 먼저 소켓에서 isOpen을 확인해야하며 true call waitforDisconnected 콜이 필요한 경우에만 확인해야합니까? (또는 이것을 피하기 위해 '기다림'이 있습니다.) 나는 당신이 '두 번째 메시지로 무언가를하라'는 것이 무엇인지 명확하지 않습니다 ... 어떻게 해결할 수 있습니까? – TSG

+3

서브 클래 싱 QThread는 단일 선형 장시간 실행 명령 블록 (예 : 이미지 처리)에 의해서만 수행되어야합니다. 이벤트/신호/슬롯, 조건 대기, 뮤텍스, 루프 등이 필요하면 객체를 생성하고이를 하위 클래스가 아닌 QThread (신호/슬롯 연결 사용)로 이동하거나 QtConcurrent를 사용하도록 제한합니다. 그러나 이것은 스레드 (스레드)로 작업하는 좋은 방법 일 수도 있습니다. valgrind가 누락 된 블록에 대한 정보를 찾을 수 없다는 것은 누수가 있어야한다고 말한 것이 아닙니다. –

답변

0

가장 좋은 답변은 위의 sebastian의 의견을 참조하십시오. 기본적으로 읽기/쓰기 오류는 소켓을 닫은 후에도 소켓에 계속되는 트래픽으로 인한 것입니다 (닫기가 모든 트래픽을 중지시키지 않습니다). 해결 방법은 스레드를 삭제할 때 소켓을 삭제하는 것입니다.