std::list中的Push_back似乎会导致内存泄漏
push_back in std::list appears to be causing memory leaks
我有一个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报告对象的销毁之后。
但是,如果该工具从程序"外部"监视内存分配和释放,则想到了泄漏的两个可能原因:
- 程序异常退出,没有展开堆栈,调用列表的析构函数,从而正确地释放内存。示例是显式或隐式调用
exit()
,std::terminate
等,例如由于抛出多个异常。 - 列表被破坏了,践踏了它拥有的内存,破坏了它对分配元素的了解。虽然这样的事情经常导致访问违规,但
memset(0)
是一个很好的候选,可以默默地破坏事情。
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 尽管遵循了规则,内存泄漏在哪里
- 为什么调用堆栈数组会导致内存泄漏
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 使用模板类的自定义列表类型中的内存泄漏
- 为什么以下C++代码中存在内存泄漏?
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 我是否生成线程并导致内存泄漏?
- 多线程程序中出现意外的内存泄漏
- 为什么此函数会导致内存泄漏?
- 在 C++ 库中使用cythonized python时内存泄漏
- 需要帮助查找内存泄漏
- 瓦尔格林德的内存泄漏使用新的
- 无法找出我的代码中的内存泄漏
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- Shared_ptr双链接列表内存泄漏
- C++ 在类中使用常量引用文本时 O2 内存泄漏