通过阅读valgrind内存泄漏“可能丢失”的报告,我了解到这种报告是误报的可能性很小。我无法理解在正常情况下如何发生这种情况而不对代码做一些非常强制的事情。
因此,为了理解这个选项,我想问是否有一个误报 valgrind“可能丢失”内存泄漏报告的简单示例?
这是一个可重复的“可能丢失”的示例:
class A {
int x;
};
class B {
int y;
};
class C : public A, public B {
int z;
};
int main() {
static B* notLost = new C(); //The upcast will change the pointer to point 4 bytes into the object, because that is the offset of the B subobject within the C object.
//Valgrind thinks, the new object may be possibly unreachable.
//But I can still do this:
// delete (C*)notLost; //The downcast undoes the pointer modification by the upcast.
}
对于“可能的泄漏”的含义似乎存在很大的认知问题。
首先,泄漏是指内存已分配但未释放。如果 Memcheck 在没有泄漏的情况下报告泄漏,则属于误报。如果您提供
malloc
的替代品,但随后为释放函数使用非标准名称(如 dealloc
)而不是 free
,则可能会发生这种情况。
其次,泄漏的分类。对于 Memcheck 发现的每个泄漏,它将扫描内存和寄存器,尝试查找指向该内存块的指针。