内存泄漏返回QIcon

时间:2012-04-11 17:25:23

标签: c++ qt memory-leaks qt4

我开始使用Qt但是我遇到了一个大问题:我实现了我的自定义模型,该模型来自QAbstractListModel类。我想要做的是显示带有图标的列表。所有工作和图像都显示我的代码,但它会造成内存泄漏。如果我没有返回图标,则检测不到内存泄漏。

class MyModel : public QAbstractListModel
{
public:
    ...

private:
    QIcon myicon;
}

QVariant MyModel::data(const QModelIndex &index, int role) const
{
    ...

    if (role == Qt::DecorationRole)
    {
        return this->myicon;
    }

    ...
}

编辑1

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

MyModel::MyModel(...)
{
    ...

    ui.listWidget->addItem(new QListWidgetItem(QIcon("myicon"), "my text"));
}

2 个答案:

答案 0 :(得分:1)

我没有看到QVariant的构造函数以QIcon作为参数,我很惊讶它编译。当您在预计QIcon时返回QVariant时,必定会有一些疯狂的隐式转换。您必须知道,在某些情况下,当您创建QVariant时,会有一个初始对象的深层副本。跟踪您创建的qvariants,并在不再需要时使用QVariant::clear()

修改
顺便说一下,你隐式使用运算符

QIcon::operator QVariant () const

返回QVariant。此变体不包含初始QIcon,而是包含深层副本。所以按照我之前的建议去除泄漏。

答案 1 :(得分:0)

我认为代码中没有内存泄漏。

QIcon已转换为QVarint(由operator QVariant定义),它被标准商品模型/商品小工具广泛使用。

您也不管理任何指针,也不使用某些显式转换。

所以,这段代码似乎没问题,但它可以是代码中的内存,使用图标。