2014-04-24 2 views
1

이것은 내 코드입니다. 그러나 나는 어디에서 m_networkManager을 삭제해야하는지 혼란 스럽다. 내가 할 수있는 onRequestCompleted() 슬롯하지만 문제는 내 프로그램 getData 함수를 자주 호출합니다.언제 QNetworkAccessManager 포인터를 삭제 하시겠습니까?

  1. getData()가 호출 :

    내 두려움이 경우입니다.

  2. onRequestCompleted() 슬롯이 실행되기 전에 나의 프로그램에서 getData()을 다시 호출합니다.
  3. onRequestCompleted() 첫 번째 getData() 통화가 시작됩니다.
  4. 내 프로그램은 getData()이 두 번째로 호출 될 때 실제로 다른 메모리에 할당 된 m_networkManager를 삭제합니다.

나는이 상황이 충돌을 일으킬 수 있다고 생각합니다. 할 때마다 MyApp::getData()라는 새로운 QNetworkAccessManager 인스턴스를 생성하기 때문에

void MyApp::getData() { 
    QNetworkRequest request; 
    request.setUrl(QUrl("http://www.domain.foo")); 

    m_networkManager = new QNetworkAccessManager(this); // Instance variable 
    connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(onRequestCompleted(QNetworkReply *))); 

    m_networkManager->get(request); 

} 

void MyApp::onRequestCompleted(QNetworkReply *reply) { 
    QByteArray data = reply->readAll(); 
    reply->deleteLater(); 
    //m_networkManager->deleteLater(); 
} 
+0

각 요청마다 새로운 QNetworkAccessManager를 만드는 이유는 무엇입니까? – thuga

답변

2

, 당신은 MyApp::onRequestCompleted() 기능의 오른쪽을 삭제하기 위해 관리해야합니다. 코드의 문제는 마지막으로 생성 된 QNetworkAccessManager을 삭제하고 슬롯 호출을 발생시킨 슬롯을 삭제하지 않는 것입니다. 제 제안은 다음과 같습니다 :

void MyApp::getData() { 
    [..] 
    // Not class member. Will be deleted in the slot. 
    QNetworkAccessManager *networkManager = new QNetworkAccessManager(this); 
    connect(m_networkManager, SIGNAL(finished(QNetworkReply*)), 
      this, SLOT(onRequestCompleted(QNetworkReply *))); 
    [..] 
} 

void MyApp::onRequestCompleted(QNetworkReply *reply) { 
    QByteArray data = reply->readAll(); 
    reply->deleteLater(); 

    // Delete object whose signal triggered this slot. 
    QObject *networkManager = sender(); 
    networkManager->deleteLater(); 
} 
+0

회신하기 전에 networkManager를 삭제해야합니까, 아니면 상관 없습니까? – user221458

+0

@ user221458, 그건 중요하지 않다고 생각합니다. – vahancho

관련 문제