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内存泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

MFC内存泄漏调试

如何防止java中的内存泄漏

记录一次DialogFragment 内存泄漏

常见的内存泄漏原因及解决方法

Android ValueAnimator --内存泄漏

Android内存泄漏查找和解决