Valgrind标记故意泄漏

时间:2013-07-25 20:45:52

标签: c memory-leaks annotations valgrind false-positive

我觉得这必须是一个功能,但我的Google-Fu让我失望了。如果之前有人问过/回答过,我会事先道歉,感觉很明显,但我找不到任何东西。

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

我知道我可以创建一个抑制文件,但感觉手动和断开连接。我更喜欢某种宏或其他源内注释,这种分配是故意永远不会释放的(例如类似于malloc(...) - > malloc_IGNORE_LEAK(...))。 valgrind是否以某种方式支持这一点?

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

2 个答案:

答案 0 :(得分:0)

下面的代码在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;
}

答案 1 :(得分:0)

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