我开始使用Qt,但我面临一个大问题:我实现了来自QAbstractListModel类的自定义模型inhrerits。我想做的是用图标显示一个列表。所有的工作和图像显示与我的代码,但它造成内存泄漏。如果我不返回图标,就不会检测到内存泄漏。
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"));
}发布于 2012-04-11 17:39:37
我不认为QVariant的构造函数使用QIcon作为参数,而且我很惊讶它会编译。当您在期望一个QIcon时返回一个QVariant时,一定有一些疯狂的隐式转换正在进行。您必须知道,在某些情况下,当您创建QVariant时,会有初始对象的深度副本。跟踪创建的q变量,并在不再需要时使用QVariant::clear()。
编辑:
顺便说一句,您正在隐式地使用运算符。
QIcon::operator QVariant () const它返回一个QVariant。这个变体不包含初始的QIcon,而是一个深拷贝。所以,遵循我先前的建议,以消除泄漏。
发布于 2012-04-11 17:54:22
我不认为内存泄漏在代码中,你展示了。
QIcon已经转换为QVarint (用operator QVariant定义),它被标准项模型/项小部件广泛使用。
您也不管理任何指针,也不使用一些显式转换。
因此,这段代码看起来不错,但它可以是代码中的一个内存,使用图标。
https://stackoverflow.com/questions/10110896
复制相似问题