free() 在 c 代码和代码中收集垃圾值即使在释放后将指针设置为 NULL 也不起作用

Posted

技术标签:

【中文标题】free() 在 c 代码和代码中收集垃圾值即使在释放后将指针设置为 NULL 也不起作用【英文标题】:free() collecting garbage value in c code and code doesn't work even when setting the pointer to NULL after freeing 【发布时间】:2013-09-28 16:43:06 【问题描述】:

当我尝试调用 free() 函数来释放内存时,它无法正常工作。这是我的代码:

unsigned char *indata;
unsigned char *outdata;

int file_func(const char *filename) 
//some other variables

for(i=0;i < no_of_files;i++) 
indata = malloc(sizeof(unsigned char));
outdata = malloc(sizeof(unsigned char));

//counts the number of characters from filename
numCharacters = readfile(filename, indata); 

/* perform some operation on indata and get outdata(size is same as indata)*/

writefile(filename, outdata);   //writes outdata to filename

    free(indata);
    free(outdata);
    

上面的代码不能正常工作,因为 free() 在 indata 和 outdata 中存储了一些随机垃圾值(因为它们变成了悬空指针)。所以我尝试在释放后将指针设置为 null,因为我正在重用与以下相同的指针:

    free(indata);
    indata = NULL;
    free(outdata);
    outdata = NULL;

即使这样我的代码也崩溃了:

双重释放或损坏(输出):0x00000000025aa240 *

我该如何克服这个问题,或者是否有任何其他替代方法可以在循环中使用动态大小的指针。谢谢。

【问题讨论】:

【参考方案1】:

您只为每个变量分配 1 个字节 (sizeof(unsigned char))。要么这是一个错误,你想在 some_number 是动态的地方分配 sizeof(unsigned char) * some_number,或者你可以只在堆栈上分配:

unsigned char indata, outdata; // then use &indata and &outdata where you need a pointer

unsigned char indata[some_number];
unsigned char outdata[some_number];

或者你可以在循环之前 malloc 一次,在循环之后释放一次。

双重释放问题看起来像您在循环中调用的函数之一正在调用释放。仔细看readfile和writefile。

【讨论】:

我想分配超过 1 个字节,即根据文件中的字符数动态分配。但是我很困惑如何在知道文件中的实际字符数之前分配内存?对于选项:“或者您可以在循环之前 malloc 一次并在循环之后释放一次。”,我应该在循环之前分配多少内存,因为文件中可以有任意数量的字符。 @annunarcist:如果你不知道你需要多少内存,你就无法分配它。您可以决定它永远不会超过 X 并分配 X,但您也可以静态地执行此操作。为什么readfile 需要indata @annunarcist:如果您想为其分配空间,您将需要另一个函数调用来找出文件 (see stat(2)) 中有多少数据。 有没有可能它仍然像函数内部一样给出错误:for(i=0;i

以上是关于free() 在 c 代码和代码中收集垃圾值即使在释放后将指针设置为 NULL 也不起作用的主要内容,如果未能解决你的问题,请参考以下文章

即使在需要时也不会进行垃圾收集

javascript垃圾收集

垃圾收集机制

Java虚拟机浅谈——垃圾收集器与内存分配策略

fortran 有垃圾收集器(gc)吗?

javaScript垃圾收集机制详细解析