流動C代碼中的內存泄漏是什麼?下面的C代碼是內存泄漏嗎?
#include <stdlib.h>
int *a;
int main() {
a = malloc(sizeof(int)*10);
return 0;
}
流動C代碼中的內存泄漏是什麼?下面的C代碼是內存泄漏嗎?
#include <stdlib.h>
int *a;
int main() {
a = malloc(sizeof(int)*10);
return 0;
}
至少大部分人使用術語的方式,答案是肯定的 - 由程序分配的任何內存,並永遠不會被釋放被認爲是泄漏。
與此同時,大多數人主要關心的是漸進式泄漏 - 當程序運行時會泄露更多內存,例如在循環內進行分配,並且無法釋放記憶。
特別是對於某些確實需要一些內存來保留程序的整個生命週期的內存,在退出之前釋放內存和分配內存直到退出完成之間的區別變得更多地是一個真正的分裂問題而不是真正的問題有用的區別。有些人認爲它留下分配的內存是一種諷刺,即使它只是在退出前立即釋放。其他人則認爲這是浪費代碼(以及引誘錯誤)在退出之前立即清除內存(當任何設計良好的操作系統將重新獲得流程資源時)。
我在寫一個靜態分析器來檢測內存泄漏。我想知道在這種情況下是否要報告警告。 –
@Zope彭黎:我會說是的,至少可以報告 - 但如果需要的話,可能允許用戶禁用報告,特別是如果每次運行都會導致一小塊不斷的塊被泄漏。作爲一項規則,在不同運行之間出現的泄漏可能更有趣。 –
感謝您的建設性意見。在我們的工具中,目前每次運行的結果都是相同的。 (沒有選擇隨機路徑) –
因爲程序只要它然後分配的Linux(或窗口)退出會自動free
內存空間,所以沒有泄漏,但你做的東西malloc
後,程序結束前,這時會出現泄漏
由'malloc'分配的內存不是顯式的'free'd,不保證被操作系統回收 - C標準不需要這種行爲。不過,我不會因爲你提到linux和windows而低估它。 –
這將由valgrind和Intel Inspector作爲內存泄漏進行報告,因爲分配的內存未被釋放。但是,這可能不會對該計劃產生影響。
如果這個分配的內存是需要的,直到程序退出,那麼這個泄漏警告可以避免。但設計必須明確說明不釋放不會導致其他問題,如內存不足。例如,可能有一個控制器對象的單例實例,只要程序運行就必須存在。
但是,如果這樣的分配丟失,從來沒有使用和設計不考慮他們,那肯定是泄漏。
現在,在你的情況下,這個分配的內存使用沒有地方。因此,這種分配必須被視爲泄漏。
當程序退出時,操作系統可能會取走所有的內存。當應用程序需要運行很長時間時(例如服務器應用程序),這不會被視爲理所當然的,並且會存在很長時間,並且將來會有很多維護。
在我發佈這個問題之前,我有點困惑。現在,我想我很清楚這個話題。謝謝! –
是的,程序中有內存泄漏。您正在分配一個大小爲10 * 4的內存[考慮int需要4個字節],並且您沒有釋放內存。爲避免內存泄漏,您必須釋放分配的內存。
#include <stdlib.h>
int *a;
int main()
{
/* allocating the Memory */
a = malloc(sizeof (int) *10);
/* free the allocate memory */
free (a);
return 0;
}
不,它很好。 – StackedCrooked
是的,你的代碼泄漏了十個整數大小的塊。但是,由於它立刻退出,內存將返回到操作系統,因此除valgrind之外,沒有人會注意到。 – dasblinkenlight
爲了獲得泄漏,您需要將它放入一個長循環中調用的函數中。 –