【发布时间】: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 我知道,别担心。然而,这确实不是这个问题的范围。
标签: c++ qt memory-leaks qvector