例如,当我在 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);
是的,它们是等价的。free()如果分配不成功,您不必调用。
请注意,这memory是指向的指针int,您必须取消引用它才能为其内存块分配一些东西;
int* memory = NULL;
memory = malloc(sizeof(int));
if (memory)
*memory=10;
free(memory);
memory = NULL;
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 成功,那么您将立即释放内存,这意味着分配它是没有意义的!现在,我想这只是为了理解这一点而简化的示例代码,而这在您的实际程序中不存在?:)
如果你确定你只释放一次也没关系。
一个好主意是当你释放它时总是设置一个指针=NULL,然后如果它再次被释放它就无关紧要了
是的。重要的是太免费了一次。(使用完内存后)
首先,您只能释放一次。因此,如果您想在循环中释放它(如您的问题所建议的那样),则第二种解决方案是唯一正确的做法。
如果您想在 if 语句中释放它,这两种解决方案在技术上都是正确的。但是,始终释放您使用的内存是一个很好的做法,然后在任何 if 语句之外始终释放内存更容易。
所以我的建议是:无论你想做什么:总是在任何循环/if语句之外释放内存(当然假设你不再需要它了)。我通常在最后一次使用它的函数末尾释放它,但它实际上取决于函数本身,它的长度,......
尝试找到自己的做事方式并坚持下去:它将为您节省大量无用的大脑时间(这真的很宝贵)
我喜欢遵循的一般经验法则是在分配内存的同一范围内释放内存。