2014-03-01 246 views
2

作爲新手的valgrind用戶本人不能找出爲什麼它輸出以下消息QMap是否會產生內存泄漏?

原因

在1塊40個字節被肯定是在損失失去

違規代碼線被以下:

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'以及你如何退出程序。如果你的對象仍然存在,你調用'exit()'或'QApplication :: quit()'(而不是從'main'返回),那麼不會調用'〜QMap()'析構函數。你應該能夠將你的代碼減少到能夠演示問題的[mcve]。 –

回答

2

Valgrind說的是,當你退出你的應用程序時,QMap中仍然有分配的內存。事實上,任何容器實現都是如此,你添加了一大堆你永遠不會清理的引用。

如果對象是一個在應用程序的整個生命週期中長期存在的對象,那麼它並不是真正的泄漏。但是,如果你破壞了類KukaDevice的對象,你需要確保你已經清除了QMap,因爲存儲的項目將生活在堆中。