std::list中的Push_back似乎会导致内存泄漏

push_back in std::list appears to be causing memory leaks

本文关键字:内存 泄漏 back 中的 list Push std      更新时间:2023-10-16

我有一个std:: vector列表(我为2d vector编写的一个非常简单的类,而不是std数据结构)。下面是这个类:

class Vertex
{
public:
Vertex()
{
    x = 0;
    y = 0;
}
Vertex(const Vertex &vert) {
    x = vert.x;
    y = vert.y;
}
Vertex(float getX, float getY)
{
    x = getX;
    y = getY;
}
Vertex & operator=(const Vertex &rhs)
{
    x = rhs.x;
    y = rhs.y;
    return *this;
}
float x, y;
};

我有几个这些向量的列表,我对它们执行如下操作(所有这些列表都声明为list:

)
if (vertList.size() != 0)
{
    Vertex newVert(x, y);
    if (loops == true)
    {
        if (axesList.size() != 0)
            axesList.pop_back();
    }
    Vertex normal = computeNormal(vertList.back(), newVert);
    axesList.push_back(normal);
    if (loops == true)
    {
        normal = computeNormal(newVert, vertList.front());
        axesList.push_back(normal);
    }
}
//actually adds the vertex
vertList.push_back(Vertex(x, y));

根据Instruments中的leaks工具,这些列表正在泄漏内存(负责的帧被列出为"std::__1::list>::push_back(Vertex const&)")由于我没有使用new声明任何实例,因此我对这种泄漏的内存感到困惑。有人知道是什么引起的吗?

如果vertList(或另一个std::list)存在并且在程序退出时不为空,则内存泄漏工具可能会抱怨其内容仍然存在。(即使你自己不使用new, std::list内部使用)

如果您的泄漏工具报告来自std::list<>::push_back的泄漏,这意味着在该函数中分配的一些内存尚未被释放,或者在泄漏检测器总结其发现时未检测到其(未检测到释放)。

最不可能的情况是您使用的std::list实现本身有缺陷,并且在正常情况下泄漏内存。
在分析检测到的泄漏如何发生时,您必须考虑到检测实际上是误报的可能性。如果泄漏检测工具认为程序已经结束,而仍有一些变量,则可能出现这种情况。
当泄漏检测是绑定到程序中的一个库时,通常会出现这种情况,该库记录分配和释放,并在库中的某些全局对象被销毁时报告泄漏。如果您的列表对象是一个全局对象或类的静态成员,那么它很容易出现静态初始化顺序惨败,这意味着它的销毁,包括已分配内存的释放可能发生在该memleak报告对象的销毁之后。

但是,如果该工具从程序"外部"监视内存分配和释放,则想到了泄漏的两个可能原因:

  1. 程序异常退出,没有展开堆栈,调用列表的析构函数,从而正确地释放内存。示例是显式或隐式调用exit(), std::terminate等,例如由于抛出多个异常。
  2. 列表被破坏了,践踏了它拥有的内存,破坏了它对分配元素的了解。虽然这样的事情经常导致访问违规,但memset(0)是一个很好的候选,可以默默地破坏事情。