簡體   English   中英

C中的內存泄漏(malloc)

[英]Memory leak in C (malloc)

為了學習堆內存,我使用了以下代碼。 我在被調用函數 (fn1) 中使用了 malloc,出於某種原因,我決定不釋放被調用函數 (fn1) 中的內存。 我將隨機分配內存的地址作為返回傳遞給調用函數(fn2)。 那么在調用函數(fn2)中使用堆內存中的數據后,我可以在調用函數(fn1)之外釋放malloc內存嗎?

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

int *add ( int*a, int*b)
{
    int *c = (int*)malloc(sizeof(int));
    *c = (*a)+(*b);
    return c;
}

void main()
{
    int a=2, b=3;
    int *s = add(&a,&b);
    printf("The sum is: %d\n", *s);
    free(s);
}

在上面的代碼中,我將動態分配的值c作為函數 return 返回並將其存儲在s中。 免費; 清除堆內存中的空間?

免費; 清除堆內存中的空間?

free(s); 釋放內存保留。 內存通常可用於其他用途。 您可以在源代碼中的任何位置釋放內存。 它不需要在分配它的同一例程中。 mallocfree用於動態內存分配,這意味着它由正在運行的程序控制,而不是由編譯器或任何編譯時約束(例如源代碼中的位置)控制。

free(s); 一般不會清理空間。 C 標准不需要實現來清除內存。 常見行為包括在重新分配內存之前保持內存不變,使用內存來幫助管理可用內存池,以及在請求時將數據模式“塗鴉”到內存中,以使其更可能出現任何不正確的使用內存會導致問題出現明顯的症狀(而不是讓錯誤未被發現)。

沒關系 ! 您可以在創建它的函數之外釋放內存,但這被認為是不好的做法。 如果'add'函數的使用者不能得到源代碼,它就無法知道你正在使用malloc。 要解決此問題,您必須將其作為參數傳遞並避免在“添加”函數中使用 malloc:

int *add ( int*a, int*b, int* res)
{
    *res = (*a)+(*b);
    return res;
}

void main()
{
    int a=2, b=3;
    int *c = (int*)malloc(sizeof(int));
    int *s = add(&a,&b, c);
    printf("The sum is: %d\n", *s);
    free(s);
}

暫無
暫無

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

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