2011-02-26 13 views
5

मुझे पता है कि हार्ड ड्राइव पर, यदि आप कोई फ़ाइल हटाते हैं, तो डेटा (तुरंत) चला नहीं जाता है। डेटा अभी भी तब तक है जब तक इसे ओवरराइट नहीं किया जाता है। मैं सोच रहा था कि स्मृति में एक समान अवधारणा मौजूद थी या नहीं। मान लें कि मैं एक स्ट्रिंग के लिए 256 बाइट आवंटित करता हूं, क्या यह स्ट्रिंग अभी भी free() के बाद मेमोरी में तैर रही है जब तक कि इसे ओवरराइट नहीं किया जाता है?मुफ्त() के बाद स्मृति के साथ क्या होता है?

+0

विंडोज़ के साथ इसका क्या संबंध है? क्या आप विशेष रूप से विंडोज़ पर पूछ रहे हैं? – UpAndAdam

उत्तर

5

आम तौर पर, यह तब तक रहता है जब तक आप इसे free से पहले स्ट्रिंग को ओवरराइट नहीं करते (जैसे लोग कभी-कभी पासवर्ड के साथ करते हैं)। कुछ लाइब्रेरी कार्यान्वयन स्वचालित रूप से इसे एक्सेस करने के लिए विलुप्त स्मृति को ओवरराइट करते हैं, लेकिन यह रिलीज़ मोड में नहीं किया जाता है।

+0

हालांकि, मुझे लगता है कि मुझे शून्य से पहले ज़ीरोमेरी का उपयोग करना चाहिए() 'इसे हटाने के बाद इसे पढ़ने के लिए रोकें। धन्यवाद। – Lienau

+1

@Lienau यदि आप कुछ ओवरकिल (हमेशा अच्छा :)) चाहते हैं, तो आप डीओडी या गुटमैन का उपयोग कर सकते हैं, लेकिन वे आपकी हार्ड ड्राइव के लिए हैं ... –

3

आपका समानता सही है। स्मृति में डेटा गायब नहीं होता है या ऐसा कुछ भी नहीं; मान free() के बाद भी वास्तव में हो सकते हैं, हालांकि मुक्त स्मृति से पढ़ने का प्रयास अपरिभाषित व्यवहार है।

3

उत्तर कार्यान्वयन पर अत्यधिक निर्भर करता है। एक अच्छे कार्यान्वयन पर, यह संभावना है कि स्मृति की कम से कम शुरुआत (या अंत?) स्मृति के मुक्त भाग को ट्रैक करने के लिए बहीखाता जानकारी के साथ ओवरराइट की जाएगी जिसे बाद में पुन: उपयोग किया जा सकता है। हालांकि विवरण अलग-अलग होंगे। यदि आपके प्रोग्राम में समेकन/धागे का स्तर है (यहां तक ​​कि लाइब्रेरी कार्यान्वयन में भी आप देख नहीं सकते हैं), तो ऐसी स्मृति को असीमित रूप से गिरफ्तार किया जा सकता है, शायद यहां तक ​​कि इस तरह से भी इसे पढ़ना खतरनाक है। और निश्चित रूप से free का कार्यान्वयन प्रोग्राम की वर्चुअल एड्रेस स्पेस से पता श्रेणी पूरी तरह से अनमैप कर सकता है, इस मामले में इसके साथ कुछ भी करने का प्रयास करने से आपके प्रोग्राम को क्रैश हो जाएगा।

किसी एप्लिकेशन लेखक के दृष्टिकोण से, आपको विनिर्देश के अनुसार free का इलाज करना चाहिए और कभी भी मुक्त स्मृति तक पहुंच नहीं लेनी चाहिए। लेकिन एक सिस्टम कार्यान्वयनकर्ता या इंटीग्रेटर के दृष्टिकोण से, कार्यान्वयन (या डिजाइन) को जानना उपयोगी हो सकता है, इस मामले में आपका प्रश्न तब दिलचस्प है।

+0

मुझे लगता है कि मेरे पास मेरी विलुप्त स्मृति को पढ़ने का कोई इरादा नहीं है जैसा मैंने सोचा था अनिश्चितता और अस्थिरता के बारे में भी यही है। सवाल सिर्फ मेरी जिज्ञासा से बाहर है। – Lienau

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

संबंधित मुद्दे

 संबंधित मुद्दे