我有一个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&)”) 由于我没有用新的声明任何实例,我被这个泄露的记忆所震惊。有没有人知道可能导致它的原因?
答案 0 :(得分:3)
如果vertList
(或其他std::list
)存在并且在程序退出时非空,则内存泄漏工具可能会抱怨其内容仍然存在。 (即使您自己不使用new
,std::list
也会在内部使用。)
否则,它几乎肯定是红鲱鱼。
答案 1 :(得分:1)
如果您的泄漏工具报告来自std::list<>::push_back
的泄漏,则意味着在泄漏检测器汇总其结果时,该功能中分配的某些内存尚未被释放或其(未检测到解除分配)。
最不可能的情况是,您使用的std::list
实施方案存在缺陷,并且在正常情况下会泄漏内存。
在分析检测到的泄漏如何发生时,您必须考虑检测实际上是误报的可能性。如果泄漏检测工具将程序视为已结束且存在某些变量,则可能出现这种情况
当泄漏检测是绑定到程序中的库时,通常就是这种情况,该库记录分配和解除分配,并在库中的某个全局对象被销毁时报告泄漏。如果你的列表对象是一个全局对象或一个类的静态成员,那么它很容易出现静态初始化命令fiasco ,这意味着它的破坏,包括释放分配的内存可能会在破坏之后发生。那个memleak报告对象。
但是,如果该工具监视程序“外部”的内存分配和解除分配,则会出现两个可能的泄漏原因:
exit()
,std::terminate
等的显式或隐式调用,例如由于抛出多个异常。memset(0)
是一个很好的候选人,可以默默地破坏事物。