有valgrind“可能丢失”报告的简单示例吗?

问题描述 投票:0回答:2

通过阅读valgrind内存泄漏“可能丢失”的报告,我了解到这种报告是误报的可能性很小。我无法理解在正常情况下如何发生这种情况而不对代码做一些非常强制的事情。

因此,为了理解这个选项,我想问是否有一个误报 valgrind“可能丢失”内存泄漏报告的简单示例?

c++ memory-leaks valgrind
2个回答
0
投票

这是一个可重复的“可能丢失”的示例:

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.
}

0
投票

对于“可能的泄漏”的含义似乎存在很大的认知问题。

首先,泄漏是指内存已分配但未释放。如果 Memcheck 在没有泄漏的情况下报告泄漏,则属于误报。如果您提供

malloc
的替代品,但随后为释放函数使用非标准名称(如
dealloc
)而不是
free
,则可能会发生这种情况。

其次,泄漏的分类。对于 Memcheck 发现的每个泄漏,它将扫描内存和寄存器,尝试查找指向该内存块的指针。

  • 如果没有找到指针,则肯定是泄漏
  • 如果它发现内存中的指针不再可访问(已释放),那么这就是间接泄漏
  • 如果它找到指向内存块开头的指针,则可以访问。
  • 如果它发现指向块内除起始位置之外的某个位置的指针,则可能存在泄漏。这可能只是随机垃圾,恰好与指针相同。它可能类似于 redzone、size:data 或 cmaster 示例中的基到派生指针。 Memcheck 很难判断这是否是偶然的(有一些启发式方法)。因为它无法分辨,所以将这些标记为潜在泄漏。
© www.soinside.com 2019 - 2024. All rights reserved.