C++ 是否有一个简单的假阳性valgrind的例子;“可能丢失”;报告?

C++ 是否有一个简单的假阳性valgrind的例子;“可能丢失”;报告?,c++,memory-leaks,valgrind,C++,Memory Leaks,Valgrind,通过阅读有关valgrind内存泄漏报告“可能丢失”的内容,我了解到这种报告是假阳性报告的可能性很小。我无法理解的是,在正常情况下,如果不对代码进行强制操作,怎么会发生这种情况 因此,为了理解此选项,我要问的是,是否存在valgrind“可能丢失”内存泄漏报告的简单误报示例?以下是“可能丢失”的误报示例: 下面是一个更一般的假阳性示例: //get asprintf #define _GNU_SOURCE #include <stdio.h> #include <assert.

通过阅读有关valgrind内存泄漏报告“可能丢失”的内容,我了解到这种报告是假阳性报告的可能性很小。我无法理解的是,在正常情况下,如果不对代码进行强制操作,怎么会发生这种情况


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

以下是“可能丢失”的误报示例:

下面是一个更一般的假阳性示例:

//get asprintf
#define _GNU_SOURCE
#include <stdio.h>
#include <assert.h>

char* getFoo() {
    static char* foo = NULL;
    if(!foo && asprintf(&foo, "Hello World\n") < 0) assert(0);
    return foo;
}

int main() {
    printf("%s", getFoo());
}
//获取asprintf
#定义GNU源
#包括
#包括
char*getFoo(){
静态字符*foo=NULL;
如果(!foo&&asprintf(&foo,“Hello World\n”)<0)断言(0);
返回foo;
}
int main(){
printf(“%s”,getFoo());
}

这是一个典型的单例ideom:某处有一个函数,提供对特殊对象(这里是“Hello World”字符串)的访问,确保只创建了一个这样的对象。由于对象从未被破坏/解除分配,Valgrind不得不认为它是内存泄漏。通常这些都被列为“仍然可以访问”,因为仍然存在可以访问它的静态变量,但这是一个误报。

对于“可能丢失”报告,是否也有一个很好的例子,因为我不明白在这种情况下怎么会有误报?@user2579277:对不起,我不能马上回复,我现在添加了一个更直接的例子。很抱歉,在valgrind报告中,您关于可能丢失的新例子并没有显示为问题。对于第二个例子,asprint在它的内核中分配内存,这样valgrind报告就不会是误报。@user2579277:我刚刚验证了“可能丢失”的例子,如果你注释掉delete语句,就会得到误报,也许我对此不够清楚。另一个例子确实有点错误,因为它显示为“仍然可以到达”而不是“丢失”,但这是valgrind的典型假阳性。不过,我认为不可能为“丢失”构造一个合理的假阳性。这个答案是完全错误的。示例代码显示了“仍然可以访问”,而不是“可能丢失”。
//get asprintf
#define _GNU_SOURCE
#include <stdio.h>
#include <assert.h>

char* getFoo() {
    static char* foo = NULL;
    if(!foo && asprintf(&foo, "Hello World\n") < 0) assert(0);
    return foo;
}

int main() {
    printf("%s", getFoo());
}