2011-05-11 35 views
5

我正在慢慢地掌握指針。但我仍然有一些問題。C初學者問題:指針運算>一旦完成清理

使用指針算法時,是否可能導致內存泄漏,因爲您正在移動指針指向的實際位置?我的意思是,如果說我向上計數複製字符串字符char,我需要倒計時,所以C「知道」指針用於指向?

由於 弗蘭克

+2

是(雖然它可能會去* BANG *,而不是內存泄漏)...指針需要指向,當你調用塊的開始free – forsvarir 2011-05-11 12:56:28

+2

只有當指針是'malloc'調用的結果時才重要。通常,如果您需要遍歷動態分配的塊,則可以使用第二個指針變量或使用數組索引,並保持原始指針變量不被修改。 – 2011-05-11 13:30:57

回答

8

內存泄漏是可能的。 free()應始終與malloc()返回的指針調用,所以是的,如果你做這樣的事情:

int* ptr = malloc(sizeof(int)); 
free(ptr + 1); 

導致不確定的行爲。可能是內存泄漏,也許是分段錯誤,任何事情都是可能的。

+0

感謝平等。當你關閉該程序時,內存泄漏是否會保留 - 我的意思是,直到你重新啓動機器纔會消失?還是取決於您使用的操作系統? – 2011-05-11 13:04:51

+0

@Frank Vilea。當進程結束時,內存應該由您的操作系統釋放。所以你不需要重新啓動你的機器。無論如何,它總是釋放內存的操作系統,所以也許存在一些不這樣做的操作系統(我不知道它們中的任何一個)。內存泄漏的問題是,您正在運行的應用程序消耗的內存比它需要的多。 – Heisenbug 2011-05-11 13:09:52

+1

看到這個問題的一些有趣的討論http://stackoverflow.com/questions/2213627/when-you-exit-ac-application-is-the-malloc-ed-memory-automatically-freed – Joe 2011-05-11 13:10:32

4

內存泄漏發生與動態存儲器分配。如果您將指針存儲到已分配的堆段,然後修改該指針引用,那麼您可能無法釋放先前分配的內存。

您應該使用另一個指針,並保留對分配內存的初始引用。 例如:使用malloc()或相似的功能和在需要時不調用free()

char *pointer = (char*)malloc (SIZE); /*alloc space for storing a string of size SIZE*/ 
char *pointer2 = pointer; 
int i; 
for (i = 0 ; i < SIZE ; i++){ 
     pointer2 += 1; 
     //you are modifying the second pointer so you always keep a reference to the allocated memory(pointer) 
} 

//now you can call free on your memory 
free(pointer); 
8

內存分配在堆上。指針就是這個指針,指向內存中的位置。您需要知道分配的內存的起始地址,以便稍後釋放它。

這是因爲內存管理系統需要記住有關分配內存的信息(例如分配了多少內存),所以它知道以後要釋放多少內存,並防止它將同一個塊分配給另一個malloc調用。內存的起始地址是標識它的地址。

如果你想擺弄指針,拿一個它的副本,不要修改原來的指針。

int *x = malloc(...); 
int *y = x; 

... pointer arithmetic with y 

free(x); 
+0

感謝喬,我喜歡通過使用副本來防止這種情況的想法。 – 2011-05-11 13:05:24

1

您可以使用指針算術創建內存泄漏,方法是指針指向錯誤的位置,以便不再引用您指向的內存塊。

無論指向的數據是用malloc()還是靜態分配,都是內存泄漏。使用malloc()動態內存泄漏是危險的,而靜態內存泄漏是無害的。

請注意,在數組外部指向是未定義的行爲:任何事情都可能發生。對指向不同數組的指針進行指針算術也是未定義的行爲。

未定義行爲的一些例子:

typedef struct 
{ 
    char array1 [6] = "hello"; 
    char array2 [6] = "world"; 
} HelloWorld_t; 


HelloWorld_t hw; 
const char* ptr = hw.array1; 
ptr += 6; /* undefined behavior, out of bounds of the original array */ 
puts(ptr); /* anything can happen here: the program may crash */ 
puts(array2 - 6); /* also undefined behavior */