2013-07-25 64 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