-1

在与此相关之前,我已经在这里看到了其他问题,但我的问题并不围绕包含指针的 QVector 展开。

我有一个“网格”类,其中包含几个 QVector< T >,用于保存顶点、索引、法线等,所有这些都作为标准对象保存。

最近我注意到,每次删除网格时,我的应用程序使用的内存量并没有减少。我一直在使用 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>();
}

但是我在这里没有看到任何问题,因为这些对象在调用之前没有被初始化。

我真的不太了解智能指针,但是我很犹豫是否要切换应用程序中的所有内容以使用它们,因为我不知道它们是否会真正或完美地替代我当前的使用而没有任何问题。例如,我可能会将一些指针(例如整个网格)传递给另一个类,但我可能不希望其他类在其自身销毁时删除该网格。

编辑:我以为我有一个写得很体面的问题,但似乎人们更喜欢跟风投反对票。我会尝试其他程序来监控我的问题。

4

1 回答 1

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是实现此目的的绝佳工具。

于 2015-06-29T05:27:44.927 回答