2014-03-01 1 views
2

:QMap에서 메모리 누수가 발생합니까? 문제가되는 코드 라인은 1 개 블록에 40 바이트는 확실히 손실에서 길을 잃었 <p> 를 따르고 있습니다</p> </blockquote> <p>내가 다음과 같은 메시지가</p> <blockquote>를 출력 이유를 알아낼 수 없습니다 초보자의 Valgrind의 사용자로

void KukaDevice::_init() 
{ 
    m_ops.insert(KukaDeviceSpace::OFF , &KukaDevice::_doNothing); 
    m_ops.insert(KukaDeviceSpace::INITIALIZING ,&KukaDevice::_doInitialization); 
    m_ops.insert(KukaDeviceSpace::STARTING ,&KukaDevice::_doStarting); 
    m_ops.insert(KukaDeviceSpace::MONITORING ,&KukaDevice::_doMonitoring); 
    m_ops.insert(KukaDeviceSpace::WORKING ,&KukaDevice::_doWorking); 
    m_ops.insert(KukaDeviceSpace::STOPPING ,&KukaDevice::_doStop); 
    m_ops.insert(KukaDeviceSpace::SHUTTINGDOWN ,&KukaDevice::_doShutdown); 
} 

변수가 정의되는 곳으로서 :

#ifndef KukaDevice_H 
#define KukaDevice_H 

#include <QMap> 

class KukaDevice : public QObject 
{ 
    Q_OBJECT 
/// High Level Operations 
void _doNothing(); /// waits 10 ms 
void _doInitialization(); 
void _doStarting(); 
void _doMonitoring(); 
void _doWorking(); 
void _doStop(); 
void _doShutdown(); 

/// Initialization 
void _init(); 

typedef void (KukaDevice::*doFunc)(); 
typedef QMap<int,doFunc> OpStack; 
OpStack m_ops; 
}; 

#endif // KukaDevice_H 
,

힌트가 있습니까? QMap이 누수를 생성 할 수 있습니까? QMap을 잘못된 방법으로 사용하고 있습니까? 감사합니다.

편집 : 어쩌면 관련 정보입니다. 응용 프로그램을 종료 할 때만 메시지가 표시 될 수 있습니다.

+0

프로그램의 나머지 부분에 정적으로 할당되는 메모리가있을 수 있습니다. 그런 다음 누출로 간주 될 수 없습니다. –

+0

당신은 당신이 당신의'KukaDevice '를 만들고 파괴하는 방법과 당신이 프로그램을 어떻게 빠져 나가는 지에 대해 충분히 보여주지 못했습니다. 만약 당신의 객체가 여전히 살아 있고'main()'에서 돌아 오는 것이 아니라'exit()'또는'QApplication :: quit()'을 호출하면'~ QMap()'소멸자가 호출되지 않습니다. 문제를 나타내는 [mcve]로 코드를 줄일 수 있어야합니다. –

답변

2

Valgrind의 말은 응용 프로그램을 끝내면 QMap에 메모리가 할당 된 것입니다. 실제로 이는 결코 정리되지 않는 참조를 추가하는 컨테이너 구현의 경우에도 마찬가지입니다.

개체가 응용 프로그램의 수명 동안 오래 살아있는 개체 인 경우 실제 누수가 아닙니다. 그러나 KukaDevice 클래스의 오브젝트를 파괴하면 저장된 아이템이 힙에 살기 때문에 QMap을 지워야합니다.