2013-07-25 61 views
1

我觉得这应该是一个功能,但我的Google-Fu失败了我。如果之前已经提过/回答过,我很抱歉,这感觉很明显,但我找不到任何东西。Valgrind标记故意泄漏

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

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

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

+0

这个答案是关于在执行结束时释放内存的问题总结了我的想法:http://stackoverflow.com/a/2213644/1609219 – Macattack

+0

我是这种情况下相反的意识形态。有问题的应用程序根本不是跨平台的(也不是试图成为),它被设计为在相对高性能的机器上的Unix环境中运行。在现代的情况下,这意味着虚拟内存。事实上,凯文的以下回答在这种情况下非常合适。这个问题不是“我应该释放程序终身记忆”,它是“我打算让操作系统完成它的工作,我怎么告诉其他工具” – Pat

+0

我理解你的问题,这就是为什么我没有发布作为一个答案,只有一个评论。话虽如此,他们还可以吗?或者,你是否可以存储指向所有分配的指针,并且这样可以保持内存的可达性,并使'--show-reachable = no'可行。 – Macattack

回答

0

下面的代码在malloc()上使用了几个全局变量和一个封装。您可以将它用于任何您不担心内存泄漏的malloc调用。使用my_malloc()进行匹配的任何内容都将显示在仍然可以访问的泄漏中,因为您仍然会参考它。

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; 
} 
+0

以这种方式使用show-reachable会将问题从错误肯定更改为错误否定。可能存在应该释放的块仍然可以访问。这只有在我释放了所有我想要的东西的情况下才有用,这就是我首先要证明的。如果我能指示valgrind“忽略从'memorys'到达的所有东西,那么它就会工作,但如果存在的话,我可以简单地将它应用于初始分配并完成它。 – Pat

0

你可以使自己的malloc包装,其登记“永久性”的分配为atexit处理程序免费。然而,如果其他线程仍然可以使用它们,这可能在多线程程序中不安全。

+0

你错过了这个问题的精神。我们的目标是*不*释放记忆,仅仅是为了向工具表达(valgrind等人)我故意“泄漏”记忆,因为没有任何意义将它释放 - 事实上可能存在负面后果。 – Pat

+0

我只是说,“在最后一刻释放内存,对程序设计非侵入性,当你不使用valgrind时容易关闭”将是一种平静泄漏报告的方法。 –

+0

啊,好点。是的,我想这将是一个解决方案,但它需要类似于Macattack的分配跟踪器,因为此程序是多线程的。在某些时候,应该在泄漏跟踪调试器中投入多少时间/精力/代码:/ – Pat