2013-09-05 3 views
1

executeAndWait를 호출하고 응답이 반환 될 때 힙의 메모리가 76KB 증가합니다. 나는 그것이 왜 일어나는 지 모른다. 이 메모리를 어떻게 정리합니까? DB와 나의 연결 생성SqlConnection의 executeAndWait은 BB10에서 메모리 누수를 일으 킵니다.

void DBHelper::execute (const QVariant &criteria,int id,bool isAsynch) 
{ 
    if (checkConnection(isAsynch)) 
    { 
     if(!isAsynch) 
     { 
      DataAccessReply reply= sqlConnector->executeAndWait(criteria, id); // memory leak happens when the reply is found. 
     this->onLoadSynchResultData(reply); 
     } 

    } 
} 

문서 링크는 here.

덕분에,

bool DBHelper::checkConnection(bool isAsynch) 
{ 
    if(sqlConnector && dbFile->exists()) 
    { 
     return true; 
    } 
    if (dbFile->exists()) 
    { 
    sqlConnector = new SqlConnection(dbPath, "connect"); 
    connect(sqlConnector, SIGNAL(reply(const bb::data::DataAccessReply&)), this, 
      SLOT(onLoadAsyncResultData(const bb::data::DataAccessReply&))); 
    return true; 
    }  
    return false; 
} 

executeAndWait에 대한 호출이 기능에, 다음입니다.

+0

이전 포인터를 덮어 쓸 때마다 SqlConnection 개체를 할당하는 것을 볼 수 있습니다. 새 것을 할당하기 전에 청소해야합니다. 원시 지점보다 QSharedPointer를 사용하는 것이 더 좋을 것입니다. –

+0

아닙니다. 개체가 이미 만들어지지 않았고 데이터베이스 파일도 생성되지 않은 경우 SqlConection 개체를 만듭니다. 따라서 객체는 실제로 한 번만 생성됩니다. – Tahlil

답변

1

DataAccessReply 클래스의 내부 메커니즘이 아닌 메모리 누수가 확실합니까? valgrind 또는 이와 유사한 도구로 ckeck하려고 했습니까?

new 및 그 다음 할당을 사용하여 할당 한 결과 sqlConnector의 유형이 뭔가에 대한 포인터라고 가정합니다. 비록 당신이 찾고있는 해결책이 아닐지라도 나는 항상 더 많은 누수 방지 기능을 가지고 있기 때문에 스마트 포인터 타입을 사용하는 것을 권장합니다.

관심이있는 경우 e를 참조하십시오. 지. boost::shared_ptr 또는 C++ 11 std::shared_ptr을 사용할 수 있습니다.

또한 암묵적 주조로 기대하는 바를 수행 중이지만 if(sqlConnector)을 사용하지 않을 것입니다. 내가 명시 적으로 if(sqlConnector != NULL) (또는 비슷한)을 사용하고 double check sqlConnector이 적절하게 초기화되도록합니다.

+0

이것은 내 문제를 해결하지 못합니다. 답장을 보내 주셔서 감사합니다 :) – Tahlil