簡體   English   中英

為什么這段代碼不會導致內存泄漏?

[英]Why this code is not causing memory leak?

我想在我的應用程序中模擬內存泄漏。 我寫下面的代碼,並試圖在perfmon中看到。

int main()
{
    int *i;
    while(1)
    {

        i = (int *) malloc(1000);

        //just to avoid lazy allocation
        *i = 100;

        if(i == NULL)
        {
            printf("Memory Not Allocated\n");
        }

        Sleep(1000);
    }
}

當我在任務管理器中看到使用過的內存時,它在52K和136K之間波動 ,但不會超過它。 手段,有些東西它顯示52K,有時136K,我不明白這個代碼一旦達到136K,回到52K,並沒有超越那個。

我嘗試使用perfmon ,但不能准確地在perfmon中看到什么,計數器的快照, 在此輸入圖像描述

請建議如何模擬內存泄漏以及如何檢測它。

雖然操作系統可能會推遲動態分配的內存的實際分配,直到使用它為止,但編譯器優化器可能會消除僅寫入並且從不讀取的分配。 因為您的寫入沒有明確定義的可觀察行為(您從未從中讀取過),編譯器可能會很好地優化它。 我建議檢查生成的匯編代碼,看看編譯器實際生成了什么。 實際上,這應該是回答問題的第一步,例如“為什么這段代碼的行為不像我認為的那樣?”。

嚴格來說,內存泄漏是依賴於上下文的:程序中的某些內容會隨着時間的推移不斷分配內存,而不會釋放它, 而它應該被釋放

您的代碼會在每次后續遍歷while循環時產生“泄漏”,因為您的程序在該點失去了先前分配的指針的知識。 這僅在檢查中可見,但在這種情況下; 從發布的代碼來看,它看起來更像是你實際上在做的事情,盡管很慢,正試圖創造一種記憶壓力的情況。

要在沒有檢查的情況下“找到”泄漏,您需要運行像valgrind (Unix / Linux / OSX)這樣的工具,或者在Visual Studio中使用DEBUG_NEW宏啟用分配跟蹤並使用調試器查看輸出。

如果你真的想急着強調內存,一次分配1024 x 1024 x 1024字節......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM