我正在慢慢地掌握指針。但我仍然有一些問題。C初學者問題:指針運算>一旦完成清理
使用指針算法時,是否可能導致內存泄漏,因爲您正在移動指針指向的實際位置?我的意思是,如果說我向上計數複製字符串字符char,我需要倒計時,所以C「知道」指針用於指向?
由於 弗蘭克
我正在慢慢地掌握指針。但我仍然有一些問題。C初學者問題:指針運算>一旦完成清理
使用指針算法時,是否可能導致內存泄漏,因爲您正在移動指針指向的實際位置?我的意思是,如果說我向上計數複製字符串字符char,我需要倒計時,所以C「知道」指針用於指向?
由於 弗蘭克
內存泄漏是可能的。 free()
應始終與malloc()
返回的指針調用,所以是的,如果你做這樣的事情:
int* ptr = malloc(sizeof(int));
free(ptr + 1);
導致不確定的行爲。可能是內存泄漏,也許是分段錯誤,任何事情都是可能的。
感謝平等。當你關閉該程序時,內存泄漏是否會保留 - 我的意思是,直到你重新啓動機器纔會消失?還是取決於您使用的操作系統? – 2011-05-11 13:04:51
@Frank Vilea。當進程結束時,內存應該由您的操作系統釋放。所以你不需要重新啓動你的機器。無論如何,它總是釋放內存的操作系統,所以也許存在一些不這樣做的操作系統(我不知道它們中的任何一個)。內存泄漏的問題是,您正在運行的應用程序消耗的內存比它需要的多。 – Heisenbug 2011-05-11 13:09:52
看到這個問題的一些有趣的討論http://stackoverflow.com/questions/2213627/when-you-exit-ac-application-is-the-malloc-ed-memory-automatically-freed – Joe 2011-05-11 13:10:32
內存泄漏發生與動態存儲器分配。如果您將指針存儲到已分配的堆段,然後修改該指針引用,那麼您可能無法釋放先前分配的內存。
您應該使用另一個指針,並保留對分配內存的初始引用。 例如:使用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);
內存分配在堆上。指針就是這個指針,指向內存中的位置。您需要知道分配的內存的起始地址,以便稍後釋放它。
這是因爲內存管理系統需要記住有關分配內存的信息(例如分配了多少內存),所以它知道以後要釋放多少內存,並防止它將同一個塊分配給另一個malloc調用。內存的起始地址是標識它的地址。
如果你想擺弄指針,拿一個它的副本,不要修改原來的指針。
int *x = malloc(...);
int *y = x;
... pointer arithmetic with y
free(x);
感謝喬,我喜歡通過使用副本來防止這種情況的想法。 – 2011-05-11 13:05:24
您可以使用指針算術創建內存泄漏,方法是指針指向錯誤的位置,以便不再引用您指向的內存塊。
無論指向的數據是用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 */
是(雖然它可能會去* BANG *,而不是內存泄漏)...指針需要指向,當你調用塊的開始free – forsvarir 2011-05-11 12:56:28
只有當指針是'malloc'調用的結果時才重要。通常,如果您需要遍歷動態分配的塊,則可以使用第二個指針變量或使用數組索引,並保持原始指針變量不被修改。 – 2011-05-11 13:30:57