例如,当我在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);
答案 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)
我想遵循的一般经验法则是释放与分配范围相同的内存。