何时释放C代码中的内存?

时间:2010-01-10 20:14:19

标签: c memory malloc calloc

例如,当我在while循环之外分配内存时,是否可以将其释放到其中? 这两个代码是否相同?

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
  free(memory);
}


int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
}
free(memory);

6 个答案:

答案 0 :(得分:4)

是的,它们是等价的。如果分配不成功,则不必调用free()
请注意,memory是指向int的指针,您必须取消引用它以将内容分配给其内存块;

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory)
    *memory=10;
free(memory);
memory = NULL;

答案 1 :(得分:4)

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
  free(memory);
}

这会崩溃。您正在设置指向内存位置10的指针,然后要求系统释放内存。你之前分配的一些内存很可能不会在0x10开始,即使是在疯狂的虚拟地址空间中也是如此。此外,IF malloc失败,没有分配内存,因此您不需要释放它。

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
}
free(memory);

这也是一个错误。如果malloc失败,那么您将指针设置为10并释放该内存。 (和以前一样。)如果malloc成功,那么你就可以立即释放内存,这意味着分配它是没有意义的!现在,我想这只是简化示例代码以获得重点,并且这在您的真实程序中不存在? :)

答案 2 :(得分:3)

如果您确定只释放一次,则无关紧要。

一个好主意是当你释放它时总是设置一个指针= NULL,然后如果它再次被释放则无关紧要

答案 3 :(得分:1)

是。重要的是它太过自由了一次。 (使用完内存后)

答案 4 :(得分:1)

首先,你只能释放一次。因此,如果你想在循环内释放它(正如你的问题所示),第二种解决方案是唯一正确的做法。

如果要在if语句中释放它,两种解决方案在技术上都是正确的。但是,总是释放你使用的内存是一个好习惯,然后在任何if语句之外更容易总是释放内存。

所以我的建议是:无论你想做什么:总是在任何循环/ if语句之外释放内存(假设你当然不再需要它)。我通常在它最后一次使用的函数结束时释放它,但它实际上取决于函数本身,它的长度,....

尝试找到你做事的方式并坚持下去:它会为你节省大量无用的大脑时间(这真的很宝贵)

答案 5 :(得分:1)

我想遵循的一般经验法则是释放与分配范围相同的内存。