2011-02-26 20 views
5

我知道在你的硬盤上,如果刪除一個文件,數據不會(立即)消失。數據仍然存在,直到它被覆蓋。我想知道在記憶中是否存在類似的概念。假設我爲一個字符串分配了256個字節,那麼這個字符串仍然會在I free()之後的某個地方浮動,直到它被覆蓋?free()後的內存會怎樣?

+0

這是什麼都與Windows呢?你是否特意問窗口? – UpAndAdam 2013-09-04 21:12:39

回答

5

一般來說,它呆在身邊,除非你明確地覆蓋該字符串free之前荷蘭國際集團它(像人們有時會做密碼)。某些庫實現會自動覆蓋釋放內存以捕獲對其的訪問,但這不是在發佈模式下完成的。

+0

這就是我雖然,我想我應該使用ZeroMemory之前,我'免費()'它防止它被釋放後被讀取。謝謝。 – Lienau 2011-02-26 04:19:27

+1

@Lienau如果你想要一些矯枉過正(總是好的:)),你可以使用國防部或古特曼,但那些適用於您的硬盤驅動器... – 2011-02-26 04:28:18

3

你的比喻是正確的。內存中的數據不會消失或類似的東西;儘管試圖從釋放的內存中讀取是未定義的行爲,但值free()之後的確可能仍然存在。

3

答案很大程度上取決於實施。在一個好的實現中,很可能至少內存的開始(或結束?)將被記錄信息覆蓋,以便跟蹤隨後可以重用的空閒塊的內存。但細節會有所不同。如果您的程序具有任何級別的併發/線程(即使在庫實現中您可能看不到),那麼這樣的內存可能會異步破壞,甚至可能以這種方式甚至讀取它是危險的。當然,free的實現可能會完全取消映射程序的虛擬地址空間的映射範圍,在這種情況下,嘗試對其執行任何操作都會導致程序崩潰。

從應用程序作者的角度來看,你應該簡單地把free根據規範,從不訪問釋放的內存。但從系統實現者或集成者的角度來看,瞭解(或設計)實現可能是有用的,在這種情況下,您的問題就變得有趣了。

+0

我真的沒有讀我的解除分配的內存,因爲我認爲任何意圖關於不確定性和不穩定性也是如此。這個問題只是出於我的好奇心。 – Lienau 2011-02-26 04:29:51

2

如果你想驗證你的執行行爲,下面的簡單程序會爲你做的。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

/* The number of memory bytes to test */ 
#define MEM_TEST_SIZE 256 

void outputMem(unsigned char *mem, int length) 
{ 
    int i; 

    for (i = 0; i < length; i++) { 
     printf("[%02d]", mem[i]); 
    } 
} 

int bytesChanged(unsigned char *mem, int length) 
{ 
    int i; 
    int count = 0; 

    for (i = 0; i < MEM_TEST_SIZE; i++) { 
     if (mem[i] != i % 256) 
      count++; 
    } 
    return count; 
} 

main(void) 
{ 
    int i; 
    unsigned char *mem = (unsigned char *)malloc(MEM_TEST_SIZE); 

    /* Fill memory with bytes */ 
    for (i = 0; i < MEM_TEST_SIZE; i++) { 
     mem[i] = i % 256; 
    } 

    printf("After malloc and copy to new mem location\n"); 
    printf("mem = %ld\n", mem); 
    printf("Contents of mem: "); 
    outputMem(mem, MEM_TEST_SIZE); 

    free(mem); 
    printf("\n\nAfter free()\n"); 
    printf("mem = %ld\n", mem); 
    printf("Bytes changed in memory = %d\n", bytesChanged(mem, MEM_TEST_SIZE)); 
    printf("Contents of mem: "); 
    outputMem(mem, MEM_TEST_SIZE); 


} 
+0

這很有意思,謝謝! – Lienau 2011-02-26 08:23:53