2

作为新手 valgrind 用户,我无法弄清楚它输出以下消息的原因

1 个块中的 40 个字节肯定会在 loss 中丢失

有问题的代码行如下:

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?谢谢!

编辑: 也许这是相关信息:该消息仅在我终止应用程序时显示。

4

1 回答 1

3

Valgrind 的意思是,当您退出应用程序时,QMap 中仍有分配的内存。事实上,任何容器实现都是如此,您添加了一堆您从未清理过的引用。

如果该对象是在应用程序的整个生命周期中都存在的长期对象,那么它并不是真正的泄漏。但是,如果您曾经销毁 KukaDevice 类的对象,则需要确保已清除 QMap,因为存储的项目将存在于堆中。

于 2014-03-24T10:13:10.230 回答