2016-06-07 22 views
-5

我總是被告知需要釋放最後配合的內存。但是自從我多次解放內存之後,這個程序並沒有顯示出任何不同。我想知道是否有任何代碼片段來展示之前配置的foget free memory的危害。這些似乎沒有問題,如果我逃脫他們。有沒有任何代碼片段證明了內存泄漏的危害或混淆了可用內存malloced

... 
int i; 
char *buff[64]; 
for(i = 0; i < 64; i++) { 
    buff[i] = malloc(1024*100); 
    strcpy(buff[i], "Some String"); 
    puts(buff[i]); 
} 
... 
+4

一個合理的現代計算機可以有多個千兆字節的內存。你分配少於兩千字節。你怎麼看? – EOF

+0

謝謝你的評論,現在怎麼樣,我改變了大小 – Tee

+0

即使更新bro後,你分配64 * 1024 * 100字節,這是6.25兆字節。 –

回答

1

好吧我會解釋這個問題。

  • 計算機有限的內存(現代個人有約8千兆字節)。 操作系統和應用程序需要內存,以便將其代碼加載到內存中並由CPU執行。
  • 現代系統內存分割成所謂的頁面同樣大小的塊,實際頁面大小的系統不同而有所不同
  • 因此,計算機具有的頁面(內存塊)大小的限制。如果正在運行的進程需要,會發生什麼比限制更多的頁面?

    • 簡單的操作系統會從內存中的幾頁,並將其保存到硬盤,這被稱爲交換
    • 後來的過程中可能需要的是被換出的頁面,所以操作系統會將其交換進去,因爲硬盤慢得多,它會嚴重影響性能

    • 如果有很多交換操作,這稱爲抖動。

因此,底線,如果誰泄露內存的過程。系統將持續抖動,進程將等待硬盤設備的長隊。

我還鼓勵您瞭解計算機體系結構和操作系統以獲得深入的見解。

+0

非常感謝你!交換是指將幾頁內容複製到磁盤中? – Tee

+0

@Tee,是的......這叫做交換......而反向操作被稱爲交換 –

1

如果您分配大量內存或重複分配內存,則會出現問題。在現代計算機上分配64倍100 KiB不會對你造成傷害,但試圖想象分配可以說100MB而不是釋放它。

另外,如果你用不同的設備編程而不是PC(可以說一些微控制器)內存少得多(可能是數百KiB或MiB),這是一個更大的問題。

爲了縮短它 - 短期內不會傷害到你,但從長遠來看,這可能是一個大問題。釋放分配的內存是非常好的做法。如果你不想手動完成,那麼你可以尋找一些智能指針和類似的解決方案(如果你可以使用C++)。

+0

我只想知道它是什麼時候會導致問題,是否會導致其他程序崩潰或使自己崩潰或使系統崩潰? – Tee

+0

想象一下,所有應用程序都會分配內存並且不釋放它。一段時間後,系統將耗盡內存並開始交換(甚至崩潰)。所以是的,它可能會導致其他應用程序或系統崩潰,因爲它們無法分配內存。 – Klinki

+0

謝謝,我給你一個「up」 – Tee

-1

試試下面的變化,使其有足夠的內存分配導致的問題,如果你不釋放所分配的內存:

... 
int i; 
char *buff[30000]; 
for(i = 0; i < 30000; i++) { 
    buff[i] = malloc(10000000); 
    strcpy(buff[i], "Some String"); 
    puts(buff[i]); 
} 
... 

這是近300千兆字節。

+4

你可能想了解延遲分配和編譯器優化。然後想知道爲什麼代碼仍能在標準PC上運行。 – Olaf

+0

啊,我的錯。抱歉。 – user1837296