函数返回的 Malloc 内存未被释放

Malloc'ed memory returned by function is not being freed

下面我使用函数 input 来收集和 return 一个字符串到函数 main。 我将 returned pointer/string 存储在一个 char* 中,并在使用后使用该变量释放 malloced 内存。

但是,在我的 free 调用之后,分配的内存似乎仍然可用。

char* input();
const int MAX = 100;

int main() {
    while(1) {
        char * input_function_pointer = input();

        printf("%p", &input_function_pointer);
        puts(input_function_pointer);   
        
        free(input_function_pointer);
        puts("_______");

        printf("%p", &input_function_pointer);
        puts(input_function_pointer); 
        puts("_______");
    }
return 0;
}

char* input() {
   char * str = malloc(MAX);
   printf( "Enter a value :");
   fgets( str, MAX, stdin );
return str;
}

无法保证如果您在 free 访问一块内存后尝试访问它会发生什么。这是未定义的行为,在这种情况下恰好适用于您的特定编译器。

释放内存不会强制擦除其内容(取决于编译器选项,主要是启用了调试)并且没有什么可以阻止您访问该内容 space。您处于未定义行为中,正在访问所谓的“悬挂指针”:您可能会在释放它后立即看到相同的内容,可能不会在其他 malloc 被调用后看到...或崩溃。

释放内存只是将 space 标记为可用于分配,不会阻止进一步的读(或写)访问。这(也是)为什么 C 被认为是“低级别”的原因。

7.22.3.3 自由函数c11

The free function causes the space pointed to by ptr to be deallocated, that is, made available for further allocation

取消引用 dangling pointer 调用未定义的行为。

free不修改释放内存的内容。它也不会改变指针。

包含对已释放内存的引用的指针称为 dangling pointer 并且取消引用它(就像您在程序中所做的那样)是未定义的行为