2011-03-24 81 views
1

我有一個關於內存分配C的多項選擇問題,但我確定哪一個是正確的答案。關於釋放內存分配C

  1. 以下有關釋放內存分配的說明中哪項是錯誤的?

    a。內存釋放後將指針解除引用分配的內存是錯誤的。

    b。對指向除分配數組的第一個元素以外的指針的free存儲器是錯誤的。

    c。內存應該在不再需要時立即釋放。

    d。只需要撥打free的一個電話即可釋放分配給calloc的整個陣列。

    e。爲了確保它被釋放,應該在程序結束之前釋放分配的內存。

他們都看我的權利:(!你知道嗎?

感謝

+1

如果你的問題是關於C的,通常不是關於C++的 - 特別是在這種情況下,它詢問'calloc'和'free',而不是'new'和'delete'。 – Cascabel 2011-03-24 05:24:26

+0

當程序結束時,您認爲程序的分配內存會發生什麼? – 2011-03-24 05:25:44

回答

5

正如其他答案給出的,e就是答案。然而有趣的選擇是c這是非常主觀的。不一定有任何理由儘快釋放記憶,在某些情況下延遲記憶是有利的。例如,如果您知道某個內存塊在釋放後很快就會被重新分配,那麼將其保留在指針中可能會花費更少,而不是將其釋放。在每種情況下,希望清楚的是,是否有這樣一個保留的指針是合理的,並且符合代碼體系結構(代碼異味!)。有時候,性能損失較小,可讀性較差 - 如果不確定,請使用您的判斷和衡量標準!

+0

感謝您的答案,並解釋爲什麼** c **不是。 – Chan 2011-03-24 05:52:13

5

答案是e。當一個進程結束時,操作系統會釋放所有它目前持有的資源,包括分配的內存。

因此沒有必要以釋放內存結束程序之前。

2

我覺得選項(e)是錯誤的。因爲當PROGR我結束了,無論您是否手動執行,所有分配的內存都由操作系統釋放。操作系統本身確保。無需通過手動釋放來確保它!

0

我認爲(e)在這裏是一個正確的答案,並且其他人都是正確的,只要他們去,但我認爲(c)也是正確的答案。首先,在某些系統上(也許是嵌入式系統),可能無法保證操作系統將釋放所有內存。這些日子當然不是一個普通的例子,但是,看起來C編程也是如此!

但更重要的是,如果承認,操作系統將會釋放了所有你的記憶集體反正(五),爲什麼「應該」存儲器只要它不再需要釋放?除非您之前需要內存,否則這不僅僅是額外的代碼,這需要時間來運行並且可能會有錯誤? (如果我發現每個釋放錯誤都有一美元...)如果只有2個字節,如果釋放內存需要更多代碼才能釋放內存?我認爲應該在便利的上發佈內存,並且可以強健地完成,除非有很好的理由(「我有大量的內存分配」可以是一個很好的理由!)。畢竟,當程序退出時,這就是操作系統釋放你的頁面的要點。這也是GC的重點:對象的生命週期很艱難。

「一旦不再需要」是用於1970年代的計算機和標準化教科書。

2

a。確實:這只是一個懸掛指針的情況。

b。 True:傳遞給free()的指針必須指向數組的頭部地址。

c。主觀的並不總是如此,但也不總是錯誤的。

d。真:多次釋放會導致未定義的行爲。你的程序可能會崩潰,或者它可能發起核攻擊。

e。錯誤:由malloc()分配的內存以及其家族的功能將保留,直到通過free()取消分配爲止。通常,僅使用標準庫函數,正在運行的C程序無法知道分配的內存塊何時被孤立。但是,當進程終止時,操作系統將回收所有這些內存。