QVector内存泄漏?
Posted
技术标签:
【中文标题】QVector内存泄漏?【英文标题】:QVector memory leak? 【发布时间】:2015-06-29 04:08:03 【问题描述】:在与此相关之前,我在这里看到过其他问题,但我的问题不涉及包含指针的 QVector。
我有一个 'Mesh' 类,它包含几个 QVector's ,用于保存顶点、索引、法线等,所有这些都作为标准对象保存。
最近我注意到,每次删除网格时,我的应用程序使用的内存量并没有减少。我一直在使用 Windows 任务管理器监控我的应用程序内存使用情况,并且看到它高达 1000mb,没有丢失一个字节。
我已通过调试器验证我正在达到我的网格类的解构器,并且我的向量正在被删除,但内存仍然没有被释放。
有问题的解构器:
Mesh::~Mesh()
QVector<QVector3D> *vertices = this->vertices;
QVector<QVector3D> *normals = this->normals;
QVector<QVector3D> *tangents = this->tangents;
QVector<QVector2D> *textures = this->UVMap;
QVector<GLushort> *indices = this->indices;
vertices->clear();
vertices->squeeze();
delete vertices;
normals->clear();
normals->squeeze();
delete normals;
tangents->clear();
tangents->squeeze();
delete tangents;
textures->clear();
textures->squeeze();
delete textures;
indices->clear();
indices->squeeze();
delete indices;
我使用了 Visual Leak Detector,它似乎主要显示我正在使用的库 (Qt) 中的泄漏,此外还告诉我我的一些构造函数正在泄漏,如下所示:
Mesh::Mesh()
vertices = new QVector<QVector3D>();
indices = new QVector<GLushort>();
UVMap = new QVector<QVector2D>();
normals = new QVector<QVector3D>();
tangents = new QVector<QVector3D>();
但我在这里没有看到任何问题,因为这些对象在调用之前没有被初始化。
我真的不太了解智能指针,但我很犹豫是否要切换应用程序中的所有内容以使用它们,因为我不知道它们是否会真正或完美地替代我目前的使用问题。例如,我可能会将一些指针(例如整个网格)传递给另一个类,但我可能不希望其他类在其自身销毁时删除该网格。
编辑: 我以为我有一个写得很体面的问题,但似乎人们更喜欢跟风投反对票。我会尝试其他程序来监控我的问题。
【问题讨论】:
不确定我是否在这里看到内存泄漏,但您是否考虑过将这些向量分配到堆栈而不是堆上?除非QVector
有一些我不知道的问题,否则这段代码似乎不必要地复杂。
我经常传递参考资料,因为我不想一直复制
@Yattabyte - 你可以很容易地将引用(或指针)传递给对象的一部分。
@Michael Kohne 我知道,别担心。然而,这确实不是这个问题的范围。
【参考方案1】:
根本没有任何内存泄漏。以下是valgrind
给出的输出
==7881== Memcheck, a memory error detector
==7881== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==7881== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==7881== Command: ./abstractitemmodel
==7881==
==7881==
==7881== HEAP SUMMARY:
==7881== in use at exit: 0 bytes in 0 blocks
==7881== total heap usage: 8 allocs, 8 frees, 168 bytes allocated
==7881==
==7881== All heap blocks were freed -- no leaks are possible
==7881==
==7881== For counts of detected and suppressed errors, rerun with: -v
==7881== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
如果你真的想检查内存泄漏,你应该使用专业的软件,比如valgrind
(for linux)。valgrind
是一个很好的工具。
【讨论】:
我没有使用 Linux,所以我不能使用 valgrind。这真的没有意义,因为尽管在每个向量上调用了 clear()、squeeze() 和 delete,但我看到内存使用保持不变。 查看link。程序员不会检查任务管理器是否存在内存泄漏。他们使用专门为此目的制作的软件。我猜你是编程新手。上面给出的代码绝对没有内存泄漏。 我编程是为了好玩,因为我当地的大学提供的东西不多,而且在这些讲座中,没有一次是更好的选择。多年来,我一直在通过个人项目进行练习,但我以前从未有过这种规模的泄漏。请避免嘲笑和假设。以上是关于QVector内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章