4

例如,当我在 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);
4

6 回答 6

5

是的,它们是等价的。free()如果分配不成功,您不必调用。
请注意,这memory是指向的指针int,您必须取消引用它才能为其内存块分配一些东西;

int* memory = NULL;
memory = malloc(sizeof(int));
if (memory)
    *memory=10;
free(memory);
memory = NULL;
于 2010-01-10T20:21:35.230 回答
4
int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
  memory=10;
  free(memory);
}

这会崩溃。您正在设置指向内存位置 10 的指针,然后要求系统释放内存。即使在虚拟地址空间的疯狂世界中,您之前分配的一些内存恰好从 10(十六进制的 0xA)开始也是极不可能的。此外,如果 malloc 失败,则没有分配内存,因此您不需要释放它。

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

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

于 2010-01-10T20:39:07.377 回答
3

如果你确定你只释放一次也没关系。

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

于 2010-01-10T20:15:40.477 回答
1

是的。重要的是太免费了一次。(使用完内存后)

于 2010-01-10T20:15:46.937 回答
1

首先,您只能释放一次。因此,如果您想在循环中释放它(如您的问题所建议的那样),则第二种解决方案是唯一正确的做法。

如果您想在 if 语句中释放它,这两种解决方案在技术上都是正确的。但是,始终释放您使用的内存是一个很好的做法,然后在任何 if 语句之外始终释放内存更容易。

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

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

于 2010-01-10T20:26:16.640 回答
1

我喜欢遵循的一般经验法则是在分配内存的同一范围内释放内存。

于 2010-01-10T20:50:33.633 回答