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

时间:2014-05-30 06:35:18

标签: c++ list pointers memory-leaks

我有一个std :: Vectors的列表(我写的2d向量的一个非常简单的类,而不是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;
};

我有几个这些向量的列表,我在这些列表上执行这样的操作(所有这些列表都被声明为列表:

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中的泄漏工具,这些列表是泄漏内存(负责的框架列为“std :: __ 1 :: list> :: push_back(Vertex const&)”) 由于我没有用新的声明任何实例,我被这个泄露的记忆所震惊。有没有人知道可能导致它的原因?

2 个答案:

答案 0 :(得分:3)

如果vertList(或其他std::list)存在并且在程序退出时非空,则内存泄漏工具可能会抱怨其内容仍然存在。 (即使您自己不使用newstd::list也会在内部使用。)

否则,它几乎肯定是红鲱鱼。

答案 1 :(得分:1)

如果您的泄漏工具报告来自std::list<>::push_back的泄漏,则意味着在泄漏检测器汇总其结果时,该功能中分配的某些内存尚未被释放或其(未检测到解除分配)。

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

但是,如果该工具监视程序“外部”的内存分配和解除分配,则会出现两个可能的泄漏原因:

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