2012-04-26 66 views
2

我介紹了存儲器錯誤的與下面的一段的C代碼:的valgrind(MEMCHECK)工具因此未檢測內存泄漏

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char** argv){ 
int i; 
int *a = (int *)malloc(sizeof(int) * 10); 
if (!a) return -1; /*malloc failed*/ 
for (i = 0; i < 11; i++){ 
    a[i] = i; 
} 

for (i = 0; i < 11; i++){ 
printf("a[%d] = %d\n",i ,a[i]); 
} 
// free(a); 
return 0; 
} 

MEMCHECK檢測到的錯誤無效的讀/寫和絕對丟失,這是正確的和預期的。

現在,我添加了相同的一段代碼到我的應用程序的共享對象文件(的.so)。此應用程序作爲服務運行,並且是守護進程。它永遠不會退出。我將valgrind應用於我的應用程序,並調用了修改後的'.so'。

MEMCHECK檢測無效的讀取/寫入錯誤,但不是絕對失去儘管所有這些錯誤是在一個method.can我得到一些幫助,使MEMCHECK檢測內存泄漏(絕對丟失)錯誤?

由於提前, PV

+0

您是否抱怨Valgrind在仍然運行的應用程序中未檢測到內存泄漏?據我所知,Valgrind在進程退出之前無法檢測內存泄漏 - 換句話說,在報告錯誤之前,您必須停止守護進程。 – 2012-04-26 12:27:41

回答

7

如何Valgrind的知道你失去了跟蹤你分配的內存?它可以在程序結束時看到內存未被釋放,但這是它可以爲你做的所有事情。如果程序永遠不會退出,valgrind認爲你可能還想在以後再釋放它。

即使將Valgrind的檢查所有的變量,並嘗試檢測,沒有一個指向你分配的內存的開頭:這是完全合法的存儲在一些修改形式的地址;例如,超過真正的開始字節(想想Pascal字符串)。所以valgrind無法檢測到你的代碼是否仍然知道分配的內存。因此,即使這樣,valgrind也無法幫助你。

-1

我認爲你的意思是

for (i = 0; i < 10; i++) 

這將是不過最好把

#define N 10 

const int N = 10; 

在你的代碼的開頭,然後使用符號N而不是10

+2

但是,那麼它不會是一個內存錯誤,這是作者試圖用valgrind檢測到的東西之一... – 2012-04-26 12:22:59

0

實際上使Valgrind的檢測泄漏,你要影響另一價值a

嘗試增加:

a = NULL; 

你對()循環之後。

現在valgrind應該抱怨!
它不會告訴你,你「無可挽回地失去了」你的記憶,除非你失去它的軌道。

+0

valgrind如何知道內存真的泄露? – Vlad 2012-04-26 13:56:39

+0

好吧,如果你忽視了alloc'ed指針的*值*,你*不能*恢復它。Valgrind具有這樣的功能:它可以知道程序中的內存區域何時未被任何值指向,就像垃圾收集器一樣。 – Gui13 2012-04-26 14:42:12

+0

不是真的。例如,我可以卸載指向文件的指針並稍後重新加載。我可以用一個常量來異或者指針,以便減少堆棧碎片的可能性。我可以通過刪除尾隨0來緊緊包裝幾個指針(由於對齊,分配的指針通常在末尾有0)。如果我使用長度爲0的字節(像Pascal字符串那樣),我可以保留一個指向下一個字節的指針。有成千上萬的有效情況下,我的代碼中沒有一個變量等於分配的指針值,但我可以恢復原始指針並釋放它。 – Vlad 2012-04-26 18:04:13