हाय मेरे पास नीचे के रूप में एक स्रोत कोड सी है:

#include <stdio.h>
#include <stdlib.h>
void test(int *a,int n)
{
    a=(int*)malloc(n * sizeof(int)); 
    for(int i=0;i<n;i++)
        a[i] = i+1;
}
int main()
{
    int *ptr;
    int n;
    n = 5;
    printf("Enter number of elements: %d\n", n);
    test(ptr,n);
    if (ptr == NULL) { 
        printf("Memory not allocated.\n");
    }
    else { 
     //...
    } 
    return 0; 
}

मेरी समझ के अनुसार, जब हम फंक्शन टेस्ट कहते हैं, तो प्रोग्राम टेस्ट के अंदर डालने के लिए pointer ptr की एक शैडो बनाएगा और फिर जब हम टेस्ट से बाहर जाएंगे तो ptr की शैडो डिलीट हो जाएगी main() ptr अभी भी NULL है, लेकिन परीक्षण के अंदर हमारे पास mallocptr के लिए एक मेमोरी है और यह मेमोरी heap में है और जब हम परीक्षण से बाहर जाते हैं तो यह मुफ़्त नहीं है। तो अगर मैं कई बार टेस्ट बुलाता हूं तो इससे मेमोरी लीक हो जाएगी क्या यह सच है? और मैं मुख्य में free() फ़ंक्शन के साथ इस मेमोरी को कैसे मुक्त कर सकता हूं?

1
Tiến Thành Nguyễn 26 जून 2020, 12:24

2 जवाब

void test(int *a,int n)
{
    a=(int*)malloc(n * sizeof(int)); 
    for(int i=0;i<n;i++)
        a[i] = i+1;
}

इससे निश्चित रूप से स्मृति रिसाव हो जाएगा!. परीक्षण फ़ंक्शन मौजूद होने से पहले free(void* buffer) को कोई कॉल नहीं आई थी। आपको उपयोक्ता सूचक की एक प्रति प्राप्त हो रही है, क्योंकि एवरे चीज़ passed by value C में है, इसका अर्थ है कि प्रतिलिपि सूचक a पर प्रत्येक संक्रिया प्रतिबिंबित नहीं होगी या काले सूचक को प्रभावित नहीं करेगी (ptr) . कैसे ठीक करना है?

डबल पॉइंटर प्राप्त करने के लिए फ़ंक्शन हस्ताक्षर बदलें! और मुख्य से वापसी से पहले free() को कॉल करना अगर मॉलोक आवंटित करने के लिए सफल हुआ।

याद रखें: हमेशा malloc() सिस्टम कॉल रिटर्न चेक करें !!

नीचे सुधार देखें:

#include <stdio.h>
#include <stdlib.h>
void test(int **a,int n)
{
    int* temp=(int*)malloc(n * sizeof(int));
    if(!temp)  /*always check malloc system call return*/
    {
       *a = NULL;
       return;
    }
    for(int i=0;i<n;i++)
        a[i] = i+1;
}
int main()
{
    int* ptr = NULL;
    ...
    
    test(&ptr, n);
    if(!ptr){
        perror("malloc failed");  /*write to standard error*/ 
        exit(EXIT_FAILURE);
    } 
    ... do work ..
    
    /*if we reach this code it means that malloc succedd then free the ptr which points to the previous allocated heap buffer*/   
    free(ptr);
    return 0; 
}
2
Adam 26 जून 2020, 12:39

मेरी समझ के अनुसार, जब हम फंक्शन टेस्ट कहते हैं, तो प्रोग्राम टेस्ट के अंदर डालने के लिए पॉइंटर ptr की एक छाया बनाएगा और फिर जब हम टेस्ट से बाहर जाएंगे तो ptr की शैडो डिलीट हो जाएगी इसलिए main() ptr अभी भी NULL है, लेकिन परीक्षण के अंदर हमारे पास पीटीआर के लिए एक स्मृति है और यह स्मृति ढेर में है और जब हम परीक्षण से बाहर जाते हैं तो यह मुफ़्त नहीं होता है। तो अगर मैं कई बार टेस्ट कॉल करता हूं तो इससे मेमोरी लीक हो जाएगी क्या यह सच है?

आपकी समझ सही है। मेमोरी लीक प्राप्त करने के लिए फ़ंक्शन को एक बार कॉल करना पर्याप्त है।

और मैं इस मेमोरी को मुख्य में मुफ्त () फ़ंक्शन के साथ कैसे मुक्त कर सकता हूं?

इसे सक्षम करने के लिए आपको कॉलर को पॉइंटर वापस करना होगा। इसे देखें:
डायनामिक मेमोरी एक्सेस केवल फंक्शन के अंदर काम करती है

1
Lundin 26 जून 2020, 12:29