首页 > 解决方案 > free() 在这种情况下如何工作?

问题描述

假设一个函数为一个字符串分配内存并返回它。调用该函数的变量,其中存储了它的返回字符串是一个指向已经动态分配的 char 的指针数组。我的疑问是,当我释放变量的内存时,它是否会同时释放变量内存和函数内字符串内存,或者函数内分配的内存是否与变量一成为一体?

char *function() {
    //allocates memory for <string>
    return <string>
}

int main() {
    //<variable> declaration
    //<variable> allocation
    <variable> = function();
    free(<variable>);
    return 0;
}
   

出于实际原因,我省略了 //function 声明部分

感谢您的关注和帮助!

标签: cmemorymemory-managementdynamic-memory-allocationfree

解决方案


有两种可能的情况:

  1. 函数使用动态内存分配分配内存,它是 100% 正确的
char *func(void)
{
    char *x = malloc(100);
    /* some code */
    return x;
}

void foo(void)
{
    char *y = func();
    free(y);
}

  1. 其他分配内存的方式。当您尝试free它们时,它们都会调用未定义的行为。此外,当指向自动变量的指针在其定义的范围之外使用时,还有另一个 UB。
char w[100];

char *func(void)
{
    char x[100];
    /* some code */
    return x;
}

char *func1(void)
{
    static char x[100];
    /* some code */
    return x;
}

char *func2(void)
{
    return w;
}


void foo(void)
{
    char *y = func();
    y[0] = 'a';       //UB
    free(y);          //UB

    y = func1();
    y[0] = 'a';
    free(y);        //UB

    y = func2();
    y[0] = 'a';
    free(y);        //UB
}


推荐阅读