gpt4 book ai didi

c++ - 是否有误报 valgrind "possibly lost"报告的简单示例?

转载 作者:可可西里 更新时间:2023-11-01 18:39:39 25 4
gpt4 key购买 nike

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

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

最佳答案

这里是一个误报“可能丢失”的例子:

class A {
int x;
};
class B {
int y;
};
class C : public A, 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.
}

这是一个更通用的误报示例:

//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());
}

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

关于c++ - 是否有误报 valgrind "possibly lost"报告的简单示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17630892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com