2011-02-26 22 views
5

Sabit diskinizde, bir dosyayı silerseniz, verilerin (anında) gitmediğini biliyorum. Üzerine yazılana kadar veriler hala var. Benzer bir kavramın hafızasında var olup olmadığını merak ediyordum. Bir dize için 256 bayt ayırdığımı varsayalım, bu dize üzerine yazılana kadar free()'dan sonra bir yerde bellekte kayan yazı var mı? Açıkça (insanlar bazen şifreleri ile yapmak gibi) bunu ing free önce dizeyi üzerine süreceÖzgür olduktan sonra belleğe ne olur?()?

+0

Bunun pencerelerle ilgisi var? Özellikle pencerelerden mi bahsediyorsunuz? – UpAndAdam

cevap

5

Genel olarak, etrafında kalmak yok. Bazı kitaplık uygulamaları otomatik olarak, kendisine erişim yakalamak için ayrılmış belleğin üzerine yazılır, ancak bu, serbest bırakma modunda yapılmaz.

+0

Yine de, sanırım serbest bırakıldıktan sonra okunduğum için bunu engellemek için ZeroMemory kullanmalıyım. Teşekkür ederim. – Lienau

+1

@Lienau Bazı overkill'leri (her zaman iyi :)) istiyorsanız, DoD veya Gutmann'ı kullanabilirsiniz, ancak bunlar Sabit Diskiniz için tasarlanmıştır ... –

3

Benzetmen doğrudur. Bellek içindeki veriler kaybolmuyor ya da böyle bir şey yok; Serbest bırakılan bellekten okumaya teşebbüs edilmemesine rağmen, değerler free()'dan sonra hala orada olabilir.

3

cevap uygulanmasına ilişkin son derece bağlıdır. İyi bir uygulamada, belleğin en azından başlangıcının (veya sonunun?), Daha sonra yeniden kullanılabilecek boş bellek parçalarının izlenmesi için defter tutma bilgilerinin üzerine yazılması muhtemeldir. Ancak detaylar değişecektir. Eğer programınızda herhangi bir eşzamanlılık/iş parçacığı düzeyi varsa (kütüphane uygulamasında bile göremeyebilirsiniz), o zaman bu tür bellek eşzamanlı olarak, belki de onu okumak bile tehlikelidir. Ve elbette, free'un uygulanması, adres aralığının programın sanal adres alanından tamamen kaldırılmasına neden olabilir; bu durumda, bununla herhangi bir şey yapmaya çalışmak, programınızı bozar. Bir uygulama yazarın bir açıdan

, sadece şartnamesine uygun free tedavi etmek ve bırakılmış belleğe erişim asla. Ancak, bir sistem uygulayıcısı veya entegratörü açısından, uygulamayı bilmek (veya tasarlamak) faydalı olabilir; bu durumda sorunuz daha sonra ilginç olur.

+0

Düşündüğüm gibi ayrılmış hafızamı okuma niyetim yok. belirsizlik ve kararsızlık hakkında aynı. Soru benim merakımın dışında. – Lienau

2

size uygulanması için davranış doğrulamak isterseniz, aşağıda basit bir program sizin için yapacak.

#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

Bu çok ilginç, teşekkürler! – Lienau

İlgili konular