Free()返回的char指针不会将其从内存中删除?

时间:2010-10-27 11:18:02

标签: c memory-management malloc

基本上问题归结为:

我加载一个文件,将所有每个字符写入一个char *变量,该变量具有malloc()文件的长度。然后我返回该变量并打印它,然后我释放()该变量的内存,并尝试再次打印该打印它的变量。

我是C的新手,所以我处理保存文本内容的变量的内存可能有些不对劲。

我尝试使用char [(ftell(file)]而不是malloc和char *,但是函数没有返回任何内容。这可能是因为它是一个局部变量,当函数返回时会被释放,对吧? / p>

以下是我的代码:

main.c中:

#include <stdio.h>
#include <stdlib.h>
#include "data/filesystem/files.h"

int main(){
    char *filebuffer = retrieve_file_content("assets/test.txt");
    printf("%s", filebuffer);
    free(filebuffer);
    printf("%s", filebuffer);
    return 0;
 }

files.c:

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

char *retrieve_file_content(char* path){
    FILE *file;
    file = fopen(path, "r");
    if(file){
        fseek(file, 0L, SEEK_END);
        char *filebuffer = malloc(ftell(file));
        if(filebuffer == NULL){ return NULL; }
        fseek(file, 0L, SEEK_SET);
        int i = 0;
        int buffer = getc(file);
        while(buffer != EOF){
            filebuffer[i] = buffer;
            buffer = getc(file);
            i++;
        }
        fclose(file);
        return filebuffer;
    }else{
        return NULL;
    }
}

的test.txt:

heheasdasdas

输出:

heheasdasdas
heheasdasdas

提前致谢!

3 个答案:

答案 0 :(得分:10)

free只标记有问题的内存可以再次自由分配,这意味着它可以被重用。但它没有将释放的内存设置为任何值。您的示例是所谓的UB(未定义行为)。具有未定义行为的程序在技术上可以做任何事情 - 包括错误/奇怪的行为,良好的行为,或通过Skype订购披萨:)

答案 1 :(得分:3)

您观察到的是未定义的行为。这次它适用于你,它可能会在下次崩溃。不要这样做。

调用free()后,内存块所有权将传递给C运行时,并且不会修改存储在块中的数据(后者是出于性能原因而完成的)。碰巧该块仍然映射到进程内存中,因此您可以安全地读取它。但是,根据多个条件,这样做会导致程序崩溃或程序读取更改的数据或任何其他后果。切勿尝试访问已经free() d。

的内存

答案 2 :(得分:1)

程序的行为是未定义的:C标准没有说明在调用free之后内存会发生什么,只是你不应再使用它了。大多数实现将其放回到空闲列表中,因此下一次调用malloc可能会使用它。有些人将其返回给操作系统,但只有小型计算机的C实现可能会这样做。有些人会擦拭它,但只有高安全性的实施可能会这样做。

I.e。:你的程序的行为完全取决于巧合,并且可能在明天/一年中/当月亮满了时可能无法工作。