C 瓦尔格兰马克故意泄漏

C 瓦尔格兰马克故意泄漏,c,memory-leaks,annotations,valgrind,false-positive,C,Memory Leaks,Annotations,Valgrind,False Positive,我觉得这应该是一个功能,但我的谷歌Fu让我失望了。如果之前有人问过/回答过,我提前道歉,这感觉很明显,但我找不到任何东西 是否有方法将分配标记为故意泄漏?上下文是一种数据结构,在程序初始化期间动态分配一次,并在整个程序生命周期内使用。没有真正的理由在程序终止之前释放所有分配的对象(当有一个破坏球朝整个房子飞来时,为什么要清理房间?),但这会导致valgrind的大量误报 我知道我可以创建一个抑制文件,但这感觉是手动的和断开的。我更希望使用某种宏或其他源代码内注释,故意不释放此分配(例如类似于ma

我觉得这应该是一个功能,但我的谷歌Fu让我失望了。如果之前有人问过/回答过,我提前道歉,这感觉很明显,但我找不到任何东西

是否有方法将分配标记为故意泄漏?上下文是一种数据结构,在程序初始化期间动态分配一次,并在整个程序生命周期内使用。没有真正的理由在程序终止之前释放所有分配的对象(当有一个破坏球朝整个房子飞来时,为什么要清理房间?),但这会导致valgrind的大量误报

我知道我可以创建一个抑制文件,但这感觉是手动的和断开的。我更希望使用某种宏或其他源代码内注释,故意不释放此分配(例如类似于
malloc(…)
->
malloc\u IGNORE\u LEAK(…)
)。valgrind在某种程度上支持这一点吗


如果没有,标记/跟踪故意“泄漏”的首选解决方案是什么?

下面的代码使用了一些全局变量和
malloc()上的包装器。您可以将其用于任何malloc调用,而不必担心内存泄漏。任何使用my_malloc()
的malloced都将显示在“仍然可以访问的泄漏”下,因为您仍然有对它的引用

void ** memorys = NULL;
size_t max_index = 0;
size_t use_index = 0;

void grow_memorys() {
    if (memorys == NULL) {
        max_index = 8;
        memorys = malloc(max_index * sizeof(void *));
    }
    else { 
        max_index *= 2;
        memorys = realloc(memorys, max_index * sizeof(void *));
    }
}   

void * my_malloc(size_t size) {
    void * point = malloc(size);
    if (use_index >= max_index) {
        grow_memorys();
    }
    memorys[use_index] = point;
    use_index++;
    return point;
}

您可以创建自己的
malloc
包装器,用于注册
atexit
处理程序的“永久”分配以释放。然而,在多线程程序中,如果其他线程仍在使用它们,这可能是不安全的。

对于一个关于在执行结束时释放内存的问题的回答总结了我的想法:在这种情况下,我的想法正好相反。所讨论的应用程序根本不是跨平台的(也不是试图跨平台的),它被设计为在一台相对高性能的机器上的Unix环境中运行。在现代语境中,这意味着虚拟内存。事实上,凯文的以下回答在这种情况下非常合适。这个问题不是“我是否应该释放程序的终身内存”,而是“我打算让操作系统完成它的工作,我如何告诉其他工具”我理解你的问题,这就是为什么我没有作为答案发布,只是一个评论。也就是说,他们仍然可以联系到吗?或者,您是否可以存储指向分配的所有内容的指针,这样可以保持内存的可访问性,并使
--show reachable=no
可行。使用
malloc
时很难避免泄漏,
malloc
从定义上讲基本上是不安全的。但是,以这种方式使用show-reachable会使问题从误报变为误报。有可能存在本应释放的仍可访问的块。这只有在我释放了所有我想要的东西的情况下才有用,这就是我首先要证明的。如果我能指示valgrind“忽略从
内存
中可访问的所有内容”,这将是可行的,但如果存在这种情况,我只需将其应用于初始分配并完成它。你错过了问题的实质。我们的目标不是释放内存,只是向工具(valgrind等人)表示,我故意“泄漏”内存,因为释放内存没有任何意义——实际上可能会有负面后果。我只是说“在最后一分钟释放内存,这种方式不会影响程序设计,并且在不使用valgrind时易于关闭“这是平息泄漏报告的一种方法。啊,更好的一点。是的,我想这是一个解决方案,但它需要类似于Macattack的分配跟踪器的东西,因为这个程序是多线程的。在某种程度上,在泄漏跟踪调试器中应该投入多少时间/精力/代码是一种折衷:/